2016-03-10 21 views
5

Ho domanda con metodo dizionario copia ad esempio Diciamo che hoPython Dizionario metodo di copia

>> d = {'pears': 200, 'apples': 400, 'oranges': 500, 'bananas': 300} 

>> copy_dict = d.copy() 

Ora se controllo id sia d ed copy_dict, entrambi sono diversi

>> id(d) 
o/p = 140634603873176 

>> id(copy_dict) 
o/p = 140634603821328 

ma se controllo l'id degli oggetti nei dizionari, sono identici id (d ['pears']) = id (copy_dict ['pears'])

>> id(d['pears']) 
o/p = 140634603971648 
>> id (copy_dict['pears']) 
o/p = 140634603971648 

Tutti gli oggetti nel nuovo dict sono riferimenti agli stessi oggetti del dettato originale.

Ora se cambio il valore della chiave "pere" in d, non c'è alcun cambiamento nella stessa chiave in copy_dict e quando controllo l'id adesso, id (d ['pears'])! = Id (copy_dict [ 'pere'])

>> d['pears'] = 700 
>> print copy_dict['pears'] 
o/p = 200 

la mia domanda è se gli oggetti nei nuovi dict sono riferimenti agli stessi oggetti del dict originale perché è il valore della nuova dict non cambia quando il valore in originale il dizionario è stato modificato e in che modo Python ha modificato immediatamente l'ID non appena ha visto il valore modificato?

Può per favore darmi una descrizione completa della differenza tra copia profonda e superficiale?

+0

Possibile duplicato di [Understanding dict.copy() - superficiale o profondo?] (Http://stackoverflow.com/questions/3975376/understanding-dict-copy-shallow-or-deep) – Backtrack

risposta

2

cambiando il valore, si sta cambiando a cosa punta il tasto. La modifica del valore nel dizionario originale non cambierà a cosa punta la chiave della copia.

una copia costruisce un nuovo oggetto complesso e (al quanto possibile) inserisce riferimenti in esso agli oggetti presenti nel dell'originale.

Una copia profonda crea un nuovo oggetto composto e quindi, in modo ricorsivo, inserisce copie degli oggetti trovati nell'originale .

Quando si copia qualcosa, copia i valori originali dell'oggetto che sta copiando, ma crea un nuovo oggetto. Non rispecchia l'oggetto originale.

+0

Ma quando copia qualcosa gli oggetti nel nuovo dict sono riferimenti agli stessi oggetti del significato del dict originale, entrambi gli indirizzi sono gli stessi, che è aliasing, quindi le modifiche apportate a uno dovrebbero anche cambiare il nuovo dict giusto? poiché entrambi puntano allo stesso indirizzo. – sans0909

+0

no, usando copy(), stai creando un nuovo oggetto. Dovresti usare l'operatore di assegnazione per ciò che stai cercando di fare: 'copy_dict = d', quindi quando aggiorni' d' aggiornerà anche 'copy_dict' perché sono lo stesso oggetto. – lciamp

+0

grazie @lciamp – sans0909

0

Il motivo è che è stata eseguita un'operazione di assegnazione che sostituisce i valori, non un'operazione di modifica del valore.

copy_dict = d.copy() 

provocato una nuova dict da creare e le sue chiavi/valori sono stati inizializzati da d. Hai notato il punto importante: si tratta di oggetti separati con ID diversi che si riferiscono solo alle stesse chiavi e valori.

d['pears'] = 700 

rimosso il riferimento 200 da d['pears'] e aggiunto un riferimento a 700. Questa riassegnazione è stata apportata sull'oggetto d in modo che, naturalmente, non venga visualizzato da altri dit che sono stati semplicemente inizializzati con le stesse chiavi e valori.

Al contrario, dovrebbe si erano semplicemente assegnato il dict originale per una seconda variabile

copy_dict = d 

Qui, dal momento che entrambi d e copy_dict riferimento lo stesso dict, riassegnazione su quel dict sarebbe visto da entrambe le variabili, perché fare riferimento allo stesso oggetto.

+0

Grazie mille, ora è chiaro :-) – sans0909