您好我正在尝试制作一个检查Palindromes的功能,我想我可以轻松使用list.reverse()
功能,但发生了一些奇怪的事情,我想知道为什么。这是我的代码:
x = list('hey')
x
['h', 'e', 'y']
y = x
y
['h', 'e', 'y']
y.reverse()
y
['y', 'e', 'h']
x
['y', 'e', 'h']
我的问题是为什么当我反转列表时它还会反转列表x?
答案 0 :(得分:2)
x
和y
指的是相同的内存位置。
>>> x = [1,2,3]
>>> id(x)
141910924
>>> y = x
>>> id(y)
141910924
>>> z = list(x)
>>> id(z)
141676844
>>> x.append(10)
>>> x
[1, 2, 3, 10]
>>> y
[1, 2, 3, 10]
>>> z
[1, 2, 3]
当我们想要将列表值分配给其他变量时,请使用copy和deepcopy e.g。
>>> import copy
>>> x = [1,2,3, [4,5]]
>>> y = copy.copy(x)
>>> id(x)
141913324
>>> id(y)
139369964
>>> x.append(10)
>>> x
[1, 2, 3, [4, 5], 10]
>>> y
[1, 2, 3, [4, 5]]
>>> x[3].append(20)
>>> x
[1, 2, 3, [4, 5, 20], 10]
>>> y
[1, 2, 3, [4, 5, 20]]
>>> z = copy.deepcopy(x)
>>> z
[1, 2, 3, [4, 5, 20], 10]
>>> x[3].append(50)
>>> x
[1, 2, 3, [4, 5, 20, 50], 10]
>>> z
[1, 2, 3, [4, 5, 20], 10]
>>>
答案 1 :(得分:0)
按值而非参考
复制x
x = list('hey')
x
['h', 'e', 'y']
y = list(x)
y
['h', 'e', 'y']
y.reverse()
y
['y', 'e', 'h']
x
['h', 'e', 'y']
答案 2 :(得分:-2)
正如Vivek所说,y
指向与x
相同的位置。要解决此问题,请使用deepcopy
模块中的copy
:
import copy
x = list('hey')
y = copy.deepcopy(x)
这将确保它们指向不同的位置并且是独立的。
对于那些认为deepcopy
是个坏主意的人,我不得不强烈反对 - 请考虑以下代码:
x = [45, 54]
y = [x, 56]
z = y[::]
print z
x[0] = 1
print z
输出结果为:
[[45, 54], 56]
[[1, 54], 56]
因为浅表副本会尽可能返回对列表元素的引用。我只是试图教OP一个通用的方法来创建一个完全独立的副本 - 无论他们试图复制的对象类型。
即使是自引用对象也由deepcopy
处理:
>>> a = [2]
>>> a.append(a)
>>> a
[2, [...]]
>>> import copy
>>> b = copy.deepcopy(a)
>>> b
[2, [...]]