python中列表内列表的索引

2024-04-24 23:19:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python列表。你知道吗

z=[[0]*6]*7

因为所有元素都是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]]

Tags: 元素列表
1条回答
网友
1楼 · 发布于 2024-04-24 23:19:52

这是python中一个经典的“程序员陷阱”。你知道吗

l = [ 0 ] * 6

创建一个包含六次相同的python对象的引用的列表,这里是数值常量0。你知道吗

现在,设置

l[0] = 1 

替换const 0对象的第一个引用为对另一个对象const 1对象的引用。你知道吗

现在,让我们看看

z=[[0]*6]*7

它首先创建一个包含对const 0对象的六个引用的列表,然后创建一个包含对该单个六元素列表的七个引用的列表。你知道吗

现在

z[0]

将给出z中的第一个元素,它与所有其他六个元素都是相同的。你知道吗

证明:

print id(z[0]) == id(z[1])

不同的对象有不同的ID。你知道吗

所以你从来没有列出过不同的清单,但都是相同的清单。你知道吗

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

z = [ [0]*6 for _ in range(7) ]

不过,我觉得你可能真的想用矩阵——如果真是这样的话,numpyndarray就是你想要的,因为:

import numpy
z = numpy.ndarray((7,6))

实际上是一个包含42个数字元素的矩阵。你知道吗

相关问题 更多 >