2015-08-20 22 views

risposta

17

Dal Assignment statements documentation: Un'istruzione di assegnazione

valuta la lista delle espressioni (ricordiamo che questo può essere una singola espressione o un elenco separato da virgole, quest'ultimo producendo una tupla) e assegna l'oggetto risultante singolo ciascuno degli elenchi di destinazione, da sinistra a destra.

Sono disponibili due elenchi di destinazione; a, b e a[b], il valore {}, 5 viene assegnato a questi due obiettivi da sinistra a destra.

Prima la tupla {}, 5 viene decompressa a a, b. Ora hai a = {} e b = 5. Notare che {} è modificabile.

successivo si assegna lo stesso dizionario e intero a a[b], dove a restituisce il dizionario, e b viene valutato come 5, quindi si sta impostando la chiave 5 nel dizionario alla tupla ({}, 5) creare un riferimento circolare. Lo {...} si riferisce quindi allo stesso oggetto che sta già facendo riferimento a a.

Perché assegnazione avviene da sinistra a destra, si può rompere questo fino a:

a, b = {}, 5 
a[b] = a, b 

così a[b][0] è lo stesso oggetto come a:

>>> a, b = {}, 5 
>>> a[b] = a, b 
>>> a 
{5: ({...}, 5)} 
>>> a[b][0] is a 
True 
+4

Hmm che è sorprendentemente poco intuitivo per Python! Mi aspetterei che si trasformi in cascata da destra a sinistra e quindi lancia un 'NameError', con' a [b] = a, b = {}, 5' in lavorazione. – Claudiu

+0

Ottima risposta. Ho capito cosa stava succedendo prima di pubblicare e stavo pianificando di pubblicare una risposta, ma tu hai risposto molto bene. Inoltre, +1 per la riga 'a [b] [0] è a'. – Andrew

+0

Bella risposta! Ma i documenti dicono che _assegna il ** singolo oggetto risultante ** a ciascuna delle liste di destinazione, da sinistra a destra_, quindi non dovrebbe essere equivalente a 'a, b = {}, 5; a [b] = {}, 5'? –

Problemi correlati