2017-10-20 69 views
1

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

回答

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,其中包含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) 

会打印:

[[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]] 
0

这是一个事实,即星号(*)运算符不创建N个新独立的名单引起的。它创建n个对同一个列表的引用。创建具有全部自主列表列表可以使用列表理解来完成,如已经建议:

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

是的,这是一个典型的蟒蛇疑难杂症。在内乘法中,您制作了9份True。这会生成一个与相同的9个实例的列表True对象。然而,True对象是不可变的,所以你不能改变它,你只需替换其中的一个,而不会影响其他对象。

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

您只能通过创建9名不同的名单

test = [[Test]*9 for i in range(9)] 
避免