请解释以下python代码

时间:2015-04-22 02:17:15

标签: python

为什么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]

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被引用而不是值“复制”。因此,在xy之一内对其进行的任何更改都会反映在另一个中。

您可以使用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]