我追加使用运算符'展开列表*'。
>>> A = [[0, 0]] * 2
>>> A
[[0, 0], [0, 0]]
当我尝试修改第一个列表项中的第一个元素时,它修改了列表中所有项目中的第一个元素。
>>> A[0][0] = 10
>>> A
[[10, 0], [10, 0]]
你可以帮我解释一下原因吗?背后的机制是什么?
答案 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)]