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 ']]?
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 ']]?
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.
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
Opérateur * agissant sur les listes fait des copies superficielles - c'est. – sashab
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. –
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)] –