为什么foo.append(bar)会影响列表列表中的所有元素?

lit*_*urt 11 python list append

我创建了一个列表列表,并希望将项目附加到各个列表,但是当我尝试附加到其中一个列表(a[0].append(2))时,该项目将添加到所有列表中.

a = []
b = [1]

a.append(b)
a.append(b)

a[0].append(2)
a[1].append(3)
print(a)
Run Code Online (Sandbox Code Playgroud)

得到: [[1, 2, 3], [1, 2, 3]]

我希望: [[1, 2], [1, 3]]

改变我构造列表的初始列表的方式,制作b浮点而不是列表并将括号放在里面.append(),给出了我想要的输出:

a = []
b = 1

a.append([b])
a.append([b])

a[0].append(2)
a[1].append(3)
print(a)
Run Code Online (Sandbox Code Playgroud)

得到: [[1, 2], [1, 3]]

但为什么?结果应该不同是不直观的.我知道这与多个对同一列表的引用有关,但我不知道发生了什么.

Bry*_*ley 23

这是因为列表包含对象的引用.你的清单不包含[[1 2 3] [1 2 3]],它是[<reference to b> <reference to b>].

当您更改对象(通过附加内容b)时,您正在更改对象本身,而不是包含该对象的列表.

为了获得您想要的效果,您的列表a必须包含副本b而不是引用b.要复制列表,您可以使用该范围[:].例如, :

>>> a=[]
>>> b=[1]
>>> a.append(b[:])
>>> a.append(b[:])
>>> a[0].append(2)
>>> a[1].append(3)
>>> print a
[[1, 2], [1, 3]]
Run Code Online (Sandbox Code Playgroud)