Python 更改布尔列表的某个索引也会更改其他索引
所以我有一个布尔列表,我将某个索引从True改为False,它也会影响列表列表中的其他元素。为什么会这样?还有别的选择吗Python 更改布尔列表的某个索引也会更改其他索引,python,python-3.x,list,boolean,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, Tr
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]]
您要做的是:
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
您正在创建一个多维列表
,该列表引用保存真值的相同内存地址
这有点像:
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)
将打印:
[[True, False, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True],
[True, True, True, True, True, True, True, True, True]]
这是因为星号(*)操作符没有创建n个新的独立列表。它创建对同一列表的n个引用。可以使用列表理解创建包含所有独立列表的列表,如前所述:
test = [[True for i in range(cols)] for j in range(rows)]
是的,这是一个经典的python问题。在内部乘法中,您复制了9份True
。它生成相同True
对象的9个实例的列表。但是,True
对象是不可变的,因此您不能更改它,只需替换其中一个对象,而不会影响其他对象
相反,在外部乘法中,您创建了相同内部列表的9个副本。然而,列表是可变的,因此,当您更改其中一个列表时,它确实会更改。由于外部列表由相同列表的副本组成,因此所有列表都将更改
你只能通过创建9个不同的列表来避免它
test = [[Test]*9 for i in range(9)]