È un'operazione; l'espressione di destra è valutata prima di applicare l'assegnazione di sinistra:
>>> a, b = 10, 20
>>> a, b
(10, 20)
>>> b, a = a, b
>>> a, b
(20, 10)
>>> a, b = a*b, a/b
>>> a, b
(200, 2)
O, se si parla di ambienti multi-threaded, quindi la cessione è non atomica; l'interprete valuta un'assegnazione tupla con un singolo codice operativo, ma utilizza codici operativi separati per poi memorizzare i risultati in ciascuna variabile interessata:
>>> def t(self): a,b=20,20
...
>>> dis.dis(t)
1 0 LOAD_CONST 2 ((20, 20))
3 UNPACK_SEQUENCE 2
6 STORE_FAST 1 (a)
9 STORE_FAST 2 (b)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
Tuttavia, normale assigment sta andando sempre essere almeno due codici operativi (uno per l'espressione di destra, una per memorizzare il risultato), quindi in python in generale l'assegnazione non è atomica. Sequenza di spacchettamento non è diverso.
fonte
2012-11-30 17:04:04
Ho l'impressione che tu stia forse fraintendendo ciò che è * comunemente * inteso dall'atomicità nello sviluppo del software. Stai parlando di sicurezza dei thread qui, o ti stai chiedendo se 'a = c' sarà eseguito prima di' b = d'? –
@MartijnPieters - Se OP si interrogasse su quest'ultimo, OP sarebbe molto confuso perché qualcosa come '(a, b) = (b, a)' potrebbe funzionare per scambiare valori. Deve essere una domanda sulla sicurezza del filo. –
@TedHopp: La domanda è troppo vaga per chiamare questo, e nella mia esperienza tuple disfare provoca molta confusione in sé e per sé. –