Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改布尔列表的某个索引也会更改其他索引_Python_Python 3.x_List_Boolean - Fatal编程技术网

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

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

所以我有一个布尔列表,我将某个索引从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]]

您要做的是:

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)]