在lis中更改列表值时的奇怪行为

2024-09-30 14:31:05 发布

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

在一个python项目上编写代码时,当我试图更改另一个列表中某个列表的值时,我注意到一个奇怪的行为

不工作代码:

lst = []
to_add = [None,None,None]

for i in range(3):
    lst.append(to_add)

for i in range(3):
    lst[i][0] = anotherslistoflists[i][0]

令我惊讶的是,这个例子产生了意想不到的结果。具体来说,每个lst[i][0]都被赋予了相同的值,该值是“anotherlistoflists”列表最后一个索引中的第一个元素

结果示例(打印lst时)

("word1",None,None)
("word1",None,None)
("word1",None,None)

工作代码:

lst = []

for i in range(5):
    lst.append([None,None,None])

# same code as above

结果示例2(预期结果)

("word1",None,None)
("word2",None,None)
("word3",None,None)

当然,正如您所看到的,问题已经解决了,但是我想知道为什么第一个代码不起作用。“添加”列表可能有问题,但我不明白这里有什么问题


Tags: to项目代码innoneadd示例列表
3条回答

您将同一列表to_add追加三次。然后,一旦修改它,指向它的所有三个项目都将反映相同的更改。如果要创建具有相同值的新副本,可以使用内置的^{}函数:

for i in range(3):
    lst.append(list(to_add))

您正在将相同的列表to_add添加到lst

>>> a = [None]
>>> b = [a]
>>> c = [a]
>>> print a, b, c
[None] [[None]] [[None]]
>>> a[0] = 1
>>> print a, b, c
[1] [[1]] [[1]]

在第一种情况下,您并不是在添加add_to_list的副本,而是在一次又一次地添加确切的列表,因此当您稍后更改它时,您正在更改真正的add_to_list以及引用它的任何地方。在第二种情况下,每次添加一个包含None的新列表,每次修改不同的列表

相关问题 更多 >