多次追加后python列表值修改的行为

时间:2014-10-15 07:06:38

标签: python

追加使用运算符'展开列表*'。

>>> A = [[0, 0]] * 2
>>> A
[[0, 0], [0, 0]]

当我尝试修改第一个列表项中的第一个元素时,它修改了列表中所有项目中的第一个元素。

>>> A[0][0] = 10
>>> A
[[10, 0], [10, 0]]
你可以帮我解释一下原因吗?背后的机制是什么?

2 个答案:

答案 0 :(得分:2)

Multiply创建引用的副本,而不是对象。引用类似于C中的指针,两个引用都指向内存中的同一个对象,但该对象只有一个副本。

如果要创建该对象的副本,请执行以下操作:

A = [[0, 0] for _ in range(2)]

这是一个生成器表达式,python将“运行”迭代,因此每次都会创建一个新元素。

答案 1 :(得分:1)

A包含对同一列表的两个引用。你所做的与

基本相同
AA = [0, 0]
A = [AA, AA]

所以A[0]A[1]AA的修改是等效的。

解决方法:

A = [[0, 0], [0, 0]]

或,如simonzack's answer所述,

A = [[0, 0] for _ in range(2)]