2010-12-15 87 views

Répondre

5

Ceci est un point commun de confusion avec Python, faire avec le passage par référence implicite . Lorsque vous tapez

x = [] 

qui lie le nom x pour pointer vers une liste vide en mémoire. Lorsque vous faites

x = [[]] * 5 

qui lie le nom x au point une liste de cinq choses, dont chacune est une référence à la même liste vide. Cela pourrait être plus clair si vous pensez comme ceci:

>>> y = [] 
>>> x = [y]*5 
>>> x 
[[], [], [], [], []] 
>>> x[0].append(0) 
>>> x 
[[0], [0], [0], [0], [0]] 
>>> y 
[0] 

C'est, même si [] ne lie pas les noms de variables, il crée encore une référence à une liste vide, qui est ensuite copié cinq fois.

Si vous ne le souhaitez pas, vous devez explicitement construire cinq listes vides pour les stocker dans x. Il existe différentes façons de le faire (copy.deepcopy est une solution générale), mais je pense que la plus nette est:

x = [[] for _ in range(5)] 

Sinon, numpy est un module d'extension qui fournit un tableau multidimensionnel très puissant.

3

Vous multiplier le contenu de la liste originale cinq fois - cette liste intérieure est juste une référence, donc la même référence est multipliée cinq fois. En d'autres termes, la liste finale que vous avez est une liste contenant plusieurs fois la même liste.

Un moyen facile autour de cela pour Python 2:

[[] for i in xrange(5)] 

Python 3:

[[] for i in range(5)] 
+0

'_' (sur' i') est recommandé car il indique "Je ne l'utilise pas réellement" (alors que 'i' est souvent utilisé comme index). – delnan