所以我有一个列表的布尔列表,我将某个索引从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]]
答案 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 list
值same 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)]