我遇到了在列表列表中更改1项的众所周知的问题。我需要使用固定大小的列表列表。
如果我使用:
In [21]: a=[[2]*2]*3
In [22]: a
Out[22]: [[2, 2], [2, 2], [2, 2]]
In [23]: a[0][0]=1
In [24]: a
Out[24]: [[1, 2], [1, 2], [1, 2]]
但是,如果我按以下方式定义列表列表,它可以工作:
In [26]: a = [
....: [2,2],
....: [2,2],
....: [2,2],
....: ]
In [27]: a
Out[27]: [[2, 2], [2, 2], [2, 2]]
In [28]: a[0][0]=1
In [29]: a
Out[29]: [[1, 2], [2, 2], [2, 2]]
对我而言,第22和27行看起来完全相同。那有什么区别?
有人可以解释我如何解决这个问题,特别是如何更改更改列表列表中单个项目的代码?如果这是不可能的,任何建议转移到不同的数据结构允许吗? 感谢
答案 0 :(得分:0)
在两个代码示例中定义矩阵的两种方法存在根本区别。在第一个(第21行)中,当您将外部列表乘以3时,实际上将引用乘以内部列表。
这是一个参数化示例:
a = [2,2]
b = [a] * 3
b => [a, a, a] => [[2,2], [2,2], [2,2]]
正如您所看到的,b
的数字表示是您所期望的,但它实际上包含3个a
的引用。因此,如果您更改任何一个内部列表,它们都会更改,因为它们实际上是相同的列表。
而不是乘法,你需要克隆列表做这样的事情
new_list = old_list[:]
或
new_list = list(old_list)
对于嵌套列表,可以使用循环来完成。