python中列表中列表的索引

python中列表中列表的索引,python,list,indexing,Python,List,Indexing,我有一个python列表 z=[[0]*6]*7 l = [ 0 ] * 6 因为所有元素都是0。但是现在如果我想更改列表中的单个元素,例如 z[0][0]=2 这将更改第一个列表的第一个元素。但它实际上改变了所有元素中的第一个元素。这对我来说太不合逻辑了。 有人能帮忙吗 [2, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0], [2, 0, 0, 0, 0, 0], [2,

我有一个python列表

z=[[0]*6]*7
l = [ 0 ] * 6
因为所有元素都是0。但是现在如果我想更改列表中的单个元素,例如

z[0][0]=2
这将更改第一个列表的第一个元素。但它实际上改变了所有元素中的第一个元素。这对我来说太不合逻辑了。 有人能帮忙吗

 [2, 0, 0, 0, 0, 0],
 [2, 0, 0, 0, 0, 0],
 [2, 0, 0, 0, 0, 0],
 [2, 0, 0, 0, 0, 0],
 [2, 0, 0, 0, 0, 0],
 [2, 0, 0, 0, 0, 0]]
这是python中一个经典的“程序员陷阱”

z=[[0]*6]*7
l = [ 0 ] * 6
创建一个列表,其中包含对同一python对象的六次引用,这里是数值常量
0

现在,设置

l[0] = 1 
将对
常量0
对象的第一个引用替换为对另一个对象
常量1
对象的引用

现在,让我们看看

z=[[0]*6]*7
这首先创建一个列表,其中包含对
const 0
对象的六个引用,然后创建一个列表,其中包含对该单个六元素列表的七个引用

现在,

将为您提供
z
中的第一个元素,它与所有其他六个元素都是相同的

证明:

print id(z[0]) == id(z[1])
不同的对象有不同的ID

所以你从来没有列出过不同的清单,但是所有的清单都是一样的

实际上,您可以创建不同的子列表,并通过如下操作将它们放在一个子列表中

z = [ [0]*6 for _ in range(7) ]
然而,我觉得你可能真的想要使用矩阵——如果真是这样,
numpy
ndarray
就是你想要的,因为:

import numpy
z = numpy.ndarray((7,6))
实际上给出了一个包含42个数值元素的矩阵