Python没有引用相同的列表

时间:2017-08-23 19:04:57

标签: python

在下面的代码中:

a=[0,1]
b=a
for i in range(2):
    for j in b:
        a=a+[j]

为什么打印为:

[0,1,0,1,0,1]

和b as:

[0,1]

然而,当在空闲时执行时,两个列表都会更改:

>>> c=[9,0]
>>> d=c
>>> d+=[7]
>>> c
[9, 0, 7]

由于附加了a,为什么b不会像python list赋值的属性那样改变?

2 个答案:

答案 0 :(得分:10)

  

由于a被追加,为什么b不会像python列表赋值的属性那样改变?

a附加 。当你写:

a = a+[j]

您每次构建一个列表[j],然后构建一个列表a+[j],其中包含a然后j的所有元素

现在您让a引用新列表,但b 仍然引用旧列表。由于旧列表未更新(状态未更改,例如通过append),列表保持不变(这很好,因为迭代您更改的列表会产生不必要的副作用)。

如果您使用a.append(j)a += [j]代替a = a + [j],则列表将更新(在后一种情况下,您隐式调用{{ 1}})。由于a.extends([j])a都引用了该列表,因此b也会更新。但请注意,既然我们同时迭代b,我们最终可能会陷入无限循环。所以你最好不要这样做。

答案 1 :(得分:5)

a未附加。使用append命令进行追加,如下所示:

a.append(1)

每次添加(a + [j])时,都会构造一个新对象。