2011-03-09 3 views
36

He intentado lo siguiente en el intérprete de Python:pitón: Al añadir un diccionario a una lista - Veo un puntero como el comportamiento

>>> 
>>> a = [] 
>>> b = {1:'one'} 
>>> a.append(b) 
>>> a 
[{1: 'one'}] 
>>> b[1] = 'ONE' 
>>> a 
[{1: 'ONE'}] 
>>> 

Aquí, después de anexar el diccionario 'b' a la lista 'A', Estoy cambiando el valor correspondiente a la tecla 1 en el diccionario 'a'. De alguna manera este cambio también se refleja en la lista. Cuando añado un diccionario a una lista, ¿no añado el valor del diccionario? Parece que he agregado un puntero al diccionario en la lista y, por lo tanto, los cambios en el diccionario también se reflejan en la lista.

No deseo que el cambio se refleje en la lista. ¿Cómo lo hago?

¡Gracias por su tiempo!

+0

Chekhov No es ** diccionario 'b' **, es ** diccionario b ** o ** diccionario de nombre 'b' **. Por cierto, escribió con error: _ "Estoy cambiando el valor correspondiente a la clave 1 en el diccionario 'a'" _ No, en el diccionario b. Con respecto a su asombro: una lista no contiene valores, contiene objetos, ya que todo es objeto en Python. O más exactamente, una lista contiene referencias a los objetos. – eyquem

+0

Chekhov También debería ver esta pregunta: (http://stackoverflow.com/questions/5242933/why-in-python-list-elem-modifies-the-original-list) – eyquem

+0

@eyquem gracias por su comentario. Estaba publicando esto a toda prisa. Mis disculpas. – neo29

Respuesta

64

Está en lo correcto en que su lista contiene una referencia en el diccionario original.

a.append(b.copy()) debería hacer el truco.

Tenga en cuenta que esto hace una copia superficial. Una alternativa es usar copy.deepcopy(b), que hace una copia profunda.

+1

¡increíble! Estuve bloqueado durante mucho tiempo en este – Yasin

10

También con dict

a = [] 
b = {1:'one'} 

a.append(dict(b)) 
print a 
b[1]='iuqsdgf' 
print a 

resultado

[{1: 'one'}] 
[{1: 'one'}] 
+0

No estoy seguro si es suficientemente rápido como copy(), pero parece ser más rápido que deepcopy(). Tal vez con un complicado esquema de diccionario estará cerca de deepcopy() porque dict() crea un nuevo diccionario. – selotec

Cuestiones relacionadas