繁体   English   中英

Python:为什么循环使用while循环中定义的列表,而不循环使用分配给列表的变量?

[英]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可以附加到每个迭代中并保持其修改? 谢谢。

由于bx是对同一列表对象的引用,因此您的代码等效于

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM