更改布尔列表列表的某个索引也会更改其他索引

时间:2017-10-20 11:18:36

标签: python python-3.x list boolean

所以我有一个列表的布尔列表,我将某个索引从True更改为False,它也会影响列表列表中的其他元素。为什么会这样?还有其他选择吗?

test = [[True]*9]*9
test[0][1] = False
print(test)

输出:

[[True, False, True, True, True, True, True, True, True], 
[True, False, True, True, True, True, True, True, True], 
[True, False, True, True, True, True, True, True, True], 
[True, False, True, True, True, True, True, True, True], 
[True, False, True, True, True, True, True, True, True], 
[True, False, True, True, True, True, True, True, True], 
[True, False, True, True, True, True, True, True, True], 
[True, False, True, True, True, True, True, True, True], 
[True, False, True, True, True, True, True, True, True]]

3 个答案:

答案 0 :(得分:1)

您想要做的是:

test = [[True for i in range(cols)] for j in range(rows)]
#OR
test = [[True]*cols for j in range(rows)]

做的问题

test = [[True]*9]*9

您要创建引用multi-dimensional listsame memory address的{​​{1}}。

有点像:

True

其中所有行指向到各自列的相同内存位置。因此,当您更改一列中的值时,它会针对整个列值进行更改。

所以,用理想的方式,

test = [ [True, True, True, True, True, True, True, True, True] repeated 9 times ]

将打印:

test = [[True for i in range(9)] for j in range(9)]
test[0][1] = False
print(test)

答案 1 :(得分:0)

这是因为星号(*)运算符不会创建新的独立列表。它创建了对同一列表的n个引用。如已建议的那样,可以使用列表推导来创建包含所有独立列表的列表:

test = [[True for i in range(cols)] for j in range(rows)]

答案 2 :(得分:0)

是的,这是一个经典的python问题。在内部乘法中,您可以制作9份True。这会生成一个包含相同 True对象的9个实例的列表。但是,True对象是不可变的,因此您无法更改它,只需替换其中一个,而不会影响其他对象。

相反,在外部乘法中,您创建了相同内部列表的9个副本。但是,列表是可变的,因此,当您更改其中一个列表时,它确实会发生变化。由于外部列表由同一列表的副本组成,因此所有内容都会发生变化。

您只能通过创建9个不同的列表来避免它

test = [[Test]*9 for i in range(9)]
相关问题