[英]Python: why are lists defined inside while loops recycled but not variables that are assigned lists inside same loop?
还是很新,我搜索了google,但是我并没有真正找到解释,因此在此先谢谢您。 在编写Python时,为什么会这样,为什么在while循环期间,可以修改在while循环之外分配了列表的变量,并在每次迭代时保留其修改,但是在循环期间分配了列表的变量会还原是每次迭代的原始分配? 这是示例代码:
x = [1,1,1]
while True:
a = [1,1,1]
b = x
a.append(1)
b.append(2)
print(a)
print(b)
为什么变量a保持不变,而变量b可以附加到每个迭代中并保持其修改? 谢谢。
由于b
和x
是对同一列表对象的引用,因此您的代码等效于
x = [1,1,1]
while True:
a = [1,1,1]
a.append(1)
x.append(2)
print(a)
print(x)
在循环的每次迭代中, x
引用的列表都会获得另一个元素。 a
在每次迭代中都引用一个新的3元素列表,因此在丢弃之前,它永远不会超过4个元素。 更容易查看是否展开(原始)循环:
x = [1,1,1]
a = [1,1,1] # new list
b = x # reference to old list
a.append(1)
b.append(2)
print(a)
print(b)
a = [1,1,1] # new list
b = x # reference to old list
a.append(1)
b.append(2)
print(a)
print(b)
...
您还可以添加一些对print(id(a))
和print(id(b))
调用,以查看id(b)
从不更改,而id(a)
在每次迭代中都更改。 (由于垃圾收集器的工作方式, id(a)
可能会在两个不同的值之间来回振荡。)
这是因为a
在每次迭代中都会重新定义,而b
则不会。 当您编写b = x
,您仅将b链接到x,并且在循环中修改b
实际上仅更改了它所引用的列表, x
引用的相同列表在每次迭代时都没有重新定义(与a
不同) )。
这是浅拷贝与深拷贝的经典案例。
下面的代码将为您提供预期的结果。
import copy
x = [1,1,1]
while True:
a = [1,1,1]
b = copy.deepcopy(x)
a.append(1)
b.append(2)
print(a)
print(b)
默认情况下,赋值语句不复制对象,它们在目标和对象之间创建绑定。
默认情况下为浅拷贝。 要完全复制值,我们需要如上面的代码所示的deepcopy
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.