为什么x值与y一起更新,如何运行任何一个请点击此代码
x = ['foo', [1,2,3], 10.4]
y = list(x)
y[0] = 'fooooooo'
y[1][0] = 4
print x
print y
Output
['foo', [4, 2, 3], 10.4]
['fooooooo', [4, 2, 3], 10.4]
答案 0 :(得分:2)
[1,2,3]
是列表x
中的嵌套列表。代码
y = list(x)
绑定y
列表x
的浅表副本,但嵌套列表保持不变。因此,通过y
更新嵌套列表会影响x
中引用的相同列表。
您可以使用is
:
>>> x = ['foo', [1,2,3], 10.4]
>>> y = list(x)
>>> x is y
False
>>> x[1] is y[1]
True
因此x[1]
和y[1]
是同一个对象。
您可以使用copy.deepcopy()
制作列表的完整副本及其嵌套元素:
>>> from copy import deepcopy
>>> x = ['foo', [1,2,3], 10.4]
>>> y = deepcopy(x)
>>> x is y
False
>>> x[1] is y[1]
False
>>> y[0] = 'fooooooo'
>>> y[1][0] = 4
>>> x
['foo', [1, 2, 3], 10.4]
>>> y
['fooooooo', [4, 2, 3], 10.4]
表明嵌套列表的新实例已复制到y
中,并且每个嵌套列表都独立于另一个。
答案 1 :(得分:1)
您使y
成为x
的浅表副本,这意味着y
的成员列表与x
中的列表相同:
>>> l = [1, 2, 3]
>>> x = ["foo", l, 10.4]
>>> y = list(x)
>>> y[1] is l
True
>>> x[1] is l
True
您可以使用copy.deepcopy
制作不能共享内部参考的x的深层副本:
>>> import copy
>>> y = copy.deepcopy(x)
>>> y[1] is l
False
>>> y[1][0] = 5
>>> y
['foo', [5, 2, 3], 10.4]
>>> l
[1, 2, 3]
>>> x
['foo', [1, 2, 3], 10.4]
答案 2 :(得分:1)
我已经完成了不同的复制方法,下面的输出会给出一个简短的描述,它是如何工作的
nodetool cleanup
当y = x ['foo',[4,2,3],10.4] ['fooooo',[4,2,3],10.4]
答案 3 :(得分:0)
因为当您初始化[1, 2, 3]
时,内部列表y
被引用而不是值“复制”。因此,在x
或y
之一内对其进行的任何更改都会反映在另一个中。
您可以使用deepcopy来获得所需的行为:
from copy import deepcopy
x = ['foo', [1,2,3], 10.4]
y = deepcopy(x)
y[0] = 'fooooooo'
y[1][0] = 4
print x
print y
输出:
['foo', [1, 2, 3], 10.4]
['fooooooo', [4, 2, 3], 10.4]