2017-10-20 35 views
1

donc j'ai une liste booléenne de listes et j'ai changé un certain index de Vrai à Faux, et cela affecte aussi d'autres éléments dans la liste des listes. Pourquoi cela se passe-t-il? Y a-t-il une alternative?Changer un certain index de la liste booléenne des listes change aussi d'autres

test = [[True]*9]*9 
test[0][1] = False 
print(test) 

La sortie:

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

Répondre

1

Qu'est-ce que vous voulez faire est:

test = [[True for i in range(cols)] for j in range(rows)] 
#OR 
test = [[True]*cols for j in range(rows)] 

Le problème faisant

test = [[True]*9]*9 

est que vous créez un multi-dimensional list que est le référencement le same memory address qui contient la valeur True.

Il est quelque chose comme ayant:

test = [ [True, True, True, True, True, True, True, True, True] repeated 9 times ] 

où les lignes tous points au même emplacement mémoire de leurs colonnes respectives. Ainsi, lorsque vous modifiez la valeur dans une colonne, elle change pour l'ensemble de la valeur de la colonne.

Ainsi, avec la manière souhaitée,

test = [[True for i in range(9)] for j in range(9)] 
test[0][1] = False 
print(test) 

imprimera:

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

Ceci est causé par le fait que l'étoile (*) ne crée pas l'opérateur n nouvelles listes indépendantes. Il crée n références à la même liste. Création d'une liste avec toutes les listes indépendantes peut être fait en utilisant une compréhension de la liste, comme cela est déjà suggéré:

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

Oui, c'est un Gotcha python classique. Dans la multiplication interne, vous faites 9 copies de True. Cela génère une liste de 9 instances de le même objetTrue. Cependant, l'objet True est immuable, donc vous ne pouvez pas le changer, il vous suffit de remplacer l'un d'entre eux, sans affecter les autres. Par contre, dans la multiplication externe, vous créez 9 copies de la même liste interne. Cependant, les listes sont mutables, donc, quand vous changez l'un d'entre eux, cela change vraiment. Puisque la liste externe est composée de copies de la même liste, tout va changer.

Vous ne pouvez l'éviter en créant 9 listes différentes

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