Python 更改列表列表中的项目

Python 更改列表列表中的项目,python,list,Python,List,可能重复: 我遇到了一个众所周知的问题,更改列表中的一项。我需要使用一个固定大小的列表 如果我使用: 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], ....:

可能重复:

我遇到了一个众所周知的问题,更改列表中的一项。我需要使用一个固定大小的列表

如果我使用:

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行看起来一模一样。那么有什么区别呢

有人能给我解释一下如何解决这个问题,特别是如何更改更改列表中单个项目的代码吗?如果这是不可能的,有没有建议移动到另一个数据结构以允许这样做?
谢谢

在两个代码示例中定义矩阵的两种方式存在根本性差异。在第一行(第21行)中,当您将外部列表乘以3时,实际上是将对内部列表的引用相乘

以下是一个参数化示例:

a = [2,2]
b = [a] * 3
b => [a, a, a] => [[2,2], [2,2], [2,2]]
正如您所看到的,
b
的数字表示是您所期望的,但它实际上包含了对
a
的3个引用。因此,如果您更改其中一个内部列表,它们都会更改,因为它们实际上是同一个列表

不需要乘法,而需要克隆列表,执行类似操作

new_list = old_list[:]


在嵌套列表的情况下,这可以使用循环来完成。

谢谢,但是如何编写一些有效的东西,并且只更改我需要更改的项目呢?我是个新手(至少在列表的使用方面是如此)。@user1640950使用这个
a=[[2]*2表示范围(3)]
great。这管用!非常感谢大家…@user1640950通过接受任何答案来感谢我们。很抱歉,我想展示两种不同的生成数组的方法是如何产生相同的输出的。然而,我知道没有办法用一个固定大小的列表来整理系统。。。
new_list = list(old_list)