Why does foo.append(bar) affect all elements in a list of lists?
本问题已经有最佳答案,请猛点这里访问。
我创建一个列表列表,并希望将项目附加到各个列表中,但是当我尝试附加到其中一个列表(
1 2 3 4 5 6 7 8 9 | a = [] b = [1] a.append(b) a.append(b) a[0].append(2) a[1].append(3) print(a) |
给出:
而我期望的是:
改变我构建列表初始列表的方式,使
1 2 3 4 5 6 7 8 9 | a = [] b = 1 a.append([b]) a.append([b]) a[0].append(2) a[1].append(3) print(a) |
给出:
但是为什么呢?结果应该是不同的,这是不直观的。我知道这与同一个列表中存在多个引用有关,但我不知道这是在哪里发生的。
这是因为列表包含对对象的引用。您的列表不包含
当您更改对象时(通过向
为了达到你想要的效果,你的清单
1 2 3 4 5 6 7 8 | >>> a=[] >>> b=[1] >>> a.append(b[:]) >>> a.append(b[:]) >>> a[0].append(2) >>> a[1].append(3) >>> print a [[1, 2], [1, 3]] |
关键是这一部分:
1 2 | a.append(b) a.append(b) |
您将两次附加同一列表,因此
在第二个示例中,每次调用append时都会创建新的列表,如
为了简单地复制一个列表,习语是
1 | a.append(b[:]) |
当加倍时,将导致a拥有两个新的列表