2017-10-20 91 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)] 
避免