在下面的代码中:
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赋值的属性那样改变?
答案 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]
)时,都会构造一个新对象。