Python:为什么在循环中循环定义列表而不是在同一循环内分配列表的变量?

时间:2018-04-02 19:28:05

标签: python function append

还是新的,我搜索谷歌,但我没有真正找到解释,所以提前谢谢你。在编写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可以附加每次迭代并保持其修改?感谢。

3 个答案:

答案 0 :(得分:1)

由于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)可能会在两个不同的值之间来回振荡。)

答案 1 :(得分:0)

这是因为 $(document).on("click", "#forward", function() { // When HTML DOM "click" event is invoked on element with ID "forward", execute the following function... $.get("../unischedule",{action:"backMonth"}, function(responseText) { // Execute Ajax GET request on URL of "unischedule" and execute the following function with Ajax response text... console.log(responseText); // your monthChanged value }); }); 在每次迭代时都被重新定义,而a则没有。当您编写b时,您只将b链接到x,并且在您的循环中修改b = x实际上只更改它引用的列表,b引用的列表相同未在每次迭代时重新定义(与x不同)。

答案 2 :(得分:-1)

这是浅拷贝与深拷贝的经典案例。

以下代码将为您提供所需的结果。

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)

默认情况下,赋值语句不复制对象,它们在目标和对象之间创建绑定。

默认情况下是浅拷贝。 要完全复制值,我们需要深度复制,如上面的代码所示