Comportamiento extraño con lista de diccionarios en python.

Aquí hay un código simple que realiza operaciones en listas:

>>> a = [0] * 5 >>> a [0, 0, 0, 0, 0] >>> a[0] = 5 >>> a [5, 0, 0, 0, 0] >>> 

Por ahora, nada anormal.

Ahora, trato de hacer lo mismo con una lista de diccionarios en lugar de una lista de enteros:

 >>> a = [{}] * 5 >>> a [{}, {}, {}, {}, {}] >>> a[0]['b'] = 4 >>> a [{'b': 4}, {'b': 4}, {'b': 4}, {'b': 4}, {'b': 4}] >>> 

No entiendo por qué se modifican todos los elementos de mi lista …

puede alguien decirme por que? ¿Y también proporcionar una solución?

Esto no es raro.


Solución:

 a = [{} for i in xrange(5)] 

[…] * 5 crea uno y una lista de cinco punteros a esto

0 es un número entero inmutable. No puede modificarlo, simplemente puede reemplazarlo con otro entero (como a[0] = 5 ). Entonces es un entero diferente.

{} es un diccionario mutable. Lo estás modificando: a[0]['b'] = 4 . Siempre es el mismo diccionario.

Prueba esto,

 a = map([].append, {} for i in xrange(3))