0

我已经苦苦挣扎了好几个小时,试图弄清楚为什么我在我的应用程序中不断得到非常奇怪的结果。当他们当然不应该这样做时,事情就一直在“开启”。我将其缩小到与以下非常相似的代码段:

test=[[False]*28]*24

print(test[5][7])
print(test[6][7])
test[5][7]=True
print(test[5][7])
print(test[6][7])

在这种特殊情况下,我只想更改第 5 个索引的第 7 个索引的值,但是,其他各种索引也会发生变化。运行它会让我:

错误的

错误的

真的

真的

虽然我希望得到:

错误的

错误的

真的

错误的

有人明白为什么会这样吗?我忽略了什么吗?它与我如何初始化我的列表有关吗?我真的只想要一个 24*28 的列表,里面装满bools = False.

4

3 回答 3

5

该行test=[[False]*28]*24创建了对同一 28 个False值列表的 24 个引用。你可能想要这样的东西:

test = [ [False]*28 for _ in range(24) ]

这会强制创建 24 个独立的False.


作为旁注 - 你应该考虑numpy

import numpy as np
test = np.zeros((24,28),dtype=bool)
于 2012-10-30T15:29:35.567 回答
0

因为它都是相同的列表。

为了说明我的观点,我使用了内置函数 id:

id(test[x])

这将为 x 的所有合法值返回相同的值

于 2012-10-30T15:29:27.687 回答
0

那么问题是,当您发出一个语句时,例如a = list[[0]] ]您没有得到一个包含其他十个较小列表的列表,每个列表中都包含一个“0”。你得到一个列表,里面有十个相同 [0]列表的实例,改变“一个”将改变“全部”——实际上,在这种情况下,所有的都是一样的。

于 2012-10-30T15:30:42.100 回答