ho visto questo frammento Python su Twitter ed era abbastanza confuso per l'uscita:Python Assegnazione Precedenza degli operatori - (a, b) = a [b] = {}, 5
>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}
quello che sta succedendo qui ?
ho visto questo frammento Python su Twitter ed era abbastanza confuso per l'uscita:Python Assegnazione Precedenza degli operatori - (a, b) = a [b] = {}, 5
>>> a, b = a[b] = {}, 5
>>> a
{5: ({...}, 5)}
quello che sta succedendo qui ?
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
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
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
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'? –