2014-07-24 4 views
0

Je crée une liste de listes de listes. Lorsque je choisis un index spécifique, il définit plusieurs entrées de liste simultanément. Que se passe t-il ici?Python: Comportement d'indexation de liste étrange

x = [] 
for i in range(3,6+1,1): 
    x.append([['','']] * i) 

x[0][0][0] = 1 
for col in x: 
    print col 

sortie:

[[1, ''], [1, ''], [1, '']] 
[['', ''], ['', ''], ['', ''], ['', '']] 
[['', ''], ['', ''], ['', ''], ['', ''], ['', '']] 
[['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', '']] 

Il est encore une question ouverte de savoir pourquoi cela ne fonctionne pas ... Voici une solution, mais ...

x = [] 
for i in range(3,6+1,1): 
    y = ['',''] 
    tmp = [] 
    for j in range(i): 
     tmp.append(y[:]) 
    x.append(tmp) 

x[0][0][0] = 1 
for col in x: 
    print col 

sortie:

[[1, ''], ['', ''], ['', '']] 
[['', ''], ['', ''], ['', ''], ['', '']] 
[['', ''], ['', ''], ['', ''], ['', ''], ['', '']] 
[['', ''], ['', ''], ['', ''], ['', ''], ['', ''], ['', '']] 

Répondre

2

Lorsque vous multipliez la liste, les objets sont r e-used, donc quand vous modifiez l'un d'entre eux, vous semblez modifier "tous" d'entre eux. En fait, il n'y a qu'une seule liste interne, mais elle apparaît à plusieurs endroits de la liste externe!

>>> x = [] 
>>> x.append([['','']] * 3) 
>>> x 
[[['', ''], ['', ''], ['', '']]] 
>>> x[0][0][0] = 1 
>>> x 
[[[1, ''], [1, ''], [1, '']]] 

Si les listes internes sont créées séparément, de sorte qu'ils sont des objets distincts, vous ne recevez pas ce problème:

>>> x = [[]] 
>>> x[0].append(['','']) 
>>> x[0].append(['','']) 
>>> x[0].append(['','']) 
>>> x 
[[['', ''], ['', ''], ['', '']]] 
>>> x[0][0][0] = 1 
>>> x 
[[[1, ''], ['', ''], ['', '']]] 

Si vous créez la liste à l'aide d'une compréhension, vous évitez aussi problème, par exemple:

x = [[['',''] for _ in range(3)]] 
+0

Ouais ... N'est-ce pas une caractéristique assez indésirable de python? –

+0

Si vous considérez cela comme une duplication d'une liste de pointeurs (vers des listes internes) alors je pense que cela a plus de sens ... – DNA