我正在网上寻找,我遇到了这三段代码。问题是预测输出并解释原因。
示例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中,我了解到x
和y
指向同一个对象,因此x
和y
都被重新定义,而不仅仅是{{ 1}}。但是,为什么在示例3中没有遵循相同的逻辑。在x
,这将导致y[0] = 'fooooooo'
和x
被重新定义,就像y
的下一行导致y[1][0] = 4
和x
都被重新定义一样重新定义在一起。
答案 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文章可以解释什么是可变的,什么不是可变的。