2012-03-31 4 views
-1

Possible en double:
Python list append behaviorPython listes imbriquées

Pourquoi ce code:

x = [[]]*3 
x[0].append('a') 
x[1].append('b') 
x[2].append('c') 
x[0]=['d'] 

print x 

print [[ 'd'] [ 'a', ' b ',' c '], [' a ',' b ',' c ']]?

+1

Cette question est littéralement posée environ une fois par jour ... Le problème semble être que vous ne pouvez pas rechercher la solution à moins que vous sachiez déjà ce qui se passe. –

+0

pour interdire un tel comportement, il est préférable de créer une liste de listes en utilisant la syntaxe suivante: >>> x = [[] pour _ in range (3)] –

Répondre

5

Cette étape est mieux expliquée par étape:

 
>>> x = [[]]*3 
>>> x 
[[], [], []] 
>>> x[0].append('a') 
>>> x 
[['a'], ['a'], ['a']] 
>>> x[1].append('b') 
>>> x 
[['a', 'b'], ['a', 'b'], ['a', 'b']] 
>>> x[2].append('c') 
>>> x 
[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']] 
>>> x[0]=['d'] 
>>> x 
[['d'], ['a', 'b', 'c'], ['a', 'b', 'c']] 

La première instruction crée une liste avec trois références au même élément en elle. Ainsi, lorsque vous modifiez le premier élément, vous modifiez également le deuxième et le troisième élément. Par conséquent, les instructions append ajoutent un numéro à chacun des éléments de la liste.

+0

Je sais que c'est tentant mais il y a déjà 50 bonnes réponses à cette question . Il suffit de lier un duplciate dans un commentaire et/ou de le marquer comme doublon jusqu'à ce que vous ayez assez de rep pour voter pour fermer. – agf

+0

Opérateur * agissant sur les listes fait des copies superficielles - c'est. – sashab