了解Python 2.x中的深层复制与浅层复制

时间:2018-08-15 15:10:15

标签: python-2.x deep-copy shallow-copy

我正在网上寻找,我遇到了这三段代码。问题是预测输出并解释原因。

示例1:

x = 42
y = x
x = x + 1
print x
print y

输出示例1:

43
42

示例2:

x = [1, 2, 3]
y = x
x[0] = 4
print x
print y

输出示例2:

[4, 2, 3]
[4, 2, 3]

示例3:

x = ['foo', [1,2,3], 10.4]
y = list(x) # or x[:]
y[0] = 'fooooooo'
y[1][0] = 4
print x
print y

输出示例3:

['foo', [4, 2, 3], 10.4]
['fooooooo', [4, 2, 3], 10.4]

在大多数情况下,我了解这是关于浅层复制和深层复制的问题,但我似乎无法将这个简单的事情包住头。在x[0] = 4的示例2中,我了解到xy指向同一个对象,因此xy都被重新定义,而不仅仅是{{ 1}}。但是,为什么在示例3中没有遵循相同的逻辑。在x,这将导致y[0] = 'fooooooo'x被重新定义,就像y的下一行导致y[1][0] = 4x都被重新定义一样重新定义在一起。

1 个答案:

答案 0 :(得分:1)

好的,所以我们可以进一步剖析一下

>>> x = ['foo', [1,2,3], 10.4]
>>> y = list(x) # or x[:]
>>> z=x
>>> id(x)
4354889544
>>> id(y)
4354890184
>>> id(z)
4354889544

>>> y[0] = 'fooooooo'
>>> y[1][0] = 4
>>> y
['fooooooo', [4, 2, 3], 10.4]
>>> x
['foo', [4, 2, 3], 10.4]
>>> id(x[1])
4354889672
>>> id(y[1])
4354889672

现在看到吗?当您使用函数List()时,它将在新的内存位置中创建一个新对象...但是为了节省空间,python会将指向可变内部对象(如列表)的指针保持不变。 This文章可以解释什么是可变的,什么不是可变的。