更改列表列表中的项目

时间:2012-09-02 15:46:41

标签: python list

  

可能重复:
  Simple python code about double loop

我遇到了在列表列表中更改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行看起来完全相同。那有什么区别?

有人可以解释我如何解决这个问题,特别是如何更改更改列表列表中单个项目的代码?如果这是不可能的,任何建议转移到不同的数据结构允许吗? 感谢

1 个答案:

答案 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)

对于嵌套列表,可以使用循环来完成。