2013-08-08 10 views

risposta

11

Non è possibile utilizzare un'istruzione di assegnazione aumentata su più destinazioni, no.

Citando il augmented assignment documentation:

Con l'eccezione di assegnare alle tuple e gli obiettivi multipli in una singola istruzione, l'assegnazione fatto da istruzioni di assegnamento aumentata viene gestita allo stesso modo le assegnazioni normali. Allo stesso modo, ad eccezione del possibile comportamento sul posto , l'operazione binaria eseguita dall'assegnazione aumentata è la stessa delle normali operazioni binarie.

Enfasi mia.

in luogo assegnamento incrementale è tradotta da target -= expression a target = target.__isub__(expression) (con corrispondenti __i...__ ganci per ogni operatore) e tradurre tale operazione di bersagli multipli non è supportata.

Sotto il cofano, assegnamento incrementale è una specializzazione degli operatori binari (+, *, -, ecc), non di assegnazione. Poiché l'implementazione si basa su quegli operatori e gli operatori binari hanno sempre solo due operandi, non sono mai stati inclusi più target nell'originale implementation proposal.

Dovrete semplicemente applicare le assegnazioni separatamente:

x -= 1 
y -= 2 

o, se davvero, davvero voleva ottenere contorto, utilizzare il modulo operator e zip() applicare operator.isub alle combinazioni (via itertools.starmap(), quindi utilizzare assegnazione tupla:

from operator import sub 
from itertools import starmap 

x, y = starmap(operator.isub, zip((x, y), (1, 2))) 

dove isub farà in modo che il gancio destro è chiamato consentendo sottrazione sul posto per i tipi mutabili th a supportarlo.

o, se si sta manipolando i tipi che non supportano la manipolazione sul posto, utilizzando un generatore di espressione sufficiente rilevare:

x, y = (val - delta for val, delta in zip((x, y), (1, 2))) 
2

Questo x, y = (1, 2) è assegnazione sequenza. Si basa sul lato destro come un oggetto iterabile, e il lato sinistro è composto dallo stesso numero di variabili dell'iterazione del lato sinistro.

Questo x, y -= (1, 2) tenta di chiamare il metodo __isub__ sull'operando (s) di sinistra.La natura di un incarico sul posto ("aumentato") è che deve prendere una variabile alla sua sinistra, il cui valore riceve la chiamata dell'operatore, e quindi la variabile riceve il risultato di quella chiamata. Python non consente la distribuzione di un incarico sul posto su più destinazioni.