Attribuzione multipla in Python, JS, ...?

2

Per caso ho scoperto questo a=b=c=d=e=f=2 nell'interprete python (2.7) (e JavaScript pochi minuti dopo).

Questa è una funzionalità o il modo in cui funziona l'interprete, se è una funzione come viene chiamata?

Le altre lingue hanno questa funzione?

    
posta Eduard Florinescu 20.09.2012 - 17:16
fonte

4 risposte

12

In molte lingue, l'operatore = restituisce il valore che è stato assegnato .

La riga a=b=c=d=e=f=2 è uguale a a = (b = ( c = (d = (e = (f = 2)))))

f=2 restituisce il valore di 2.

Quindi, questo si riduce a a = (b = ( c = (d = (e = 2)))) e così via.

Questo è noto come assegnazione concatenata

    
risposta data 20.09.2012 - 20:28
fonte
4

Questo tipo di funzionalità è in genere noto come "assegnazione multipla". Molte lingue hanno questo tipo di funzionalità.

Questo tipo di funzionalità è in genere noto come "assegnazione concatenata". Le lingue che considerano l'assegnazione come espressioni hanno questo tipo di funzionalità.

L'assegnazione multipla in genere significa qualcos'altro, ad es. Python:

a, b, c, d, e, f = [2, 2, 2, 2, 2, 2]

Questo tipo di struttura della sintassi può essere definito come assegnazione multipla. Nel contesto di Python, questo è anche noto come spacchettamento.

Il programmatore astuto potrebbe notare che questo è correlato a più valori di ritorno:

def f(): return [1, 2, 3]
a, b, c = f()

Ci sono un gran numero di lingue che supportano l'assegnazione concatenata o l'assegnazione multipla in modi diversi.

C, C ++, Java e C # supportano la sintassi che hai fornito. VB non supporta l'assegnazione concatenata (poiché l'assegnazione è un'istruzione e non un'espressione come nella famiglia C). Go supporta più assegnazioni in modo simile a Python, ad es. uno scambio:

a, b = b, a

Credo che Lua supporti più incarichi e più valori di ritorno. Può essere fatto in un Lisp, ma di solito c'è un modo migliore per farlo.

Fondamentalmente, la maggior parte delle lingue supporta in qualche modo una di queste funzionalità.

    
risposta data 20.09.2012 - 17:33
fonte
2

Assegnazioni come queste sono OK per oggetti semplici. Per altri, può portare a effetti collaterali indesiderati. Nell'elenco collegato, nell'esempio seguente, nella riga:

last = last.nxt = Item(2)

Potremmo aspettarci che Item (1) .nxt punti a Item (2) e last points a Item (2) Tuttavia, ci ritroviamo con un riferimento circolare dove Item (2) .nxt punta a se stesso.

Ad esempio:

class Item(object):
    def __init__(self, value):
        self.value = value
        self.nxt = None

    def __str__(self):
        return 'self: id(self): %d, value: %s, nxt: %d' % (id(self), \
                str(self.value), id(self.nxt))


 prev = last = Item(1)

 print prev
 >>> self: id(self): 140382915976272, value: 1, nxt: 9568656
 print last
 >>> self: id(self): 140382915976272, value: 1, nxt: 9568656
 print id(None)
 >>> 9568656

 last = last.nxt = Item(2)
 print prev
 >>> self: id(self): 140382915976272, value: 1, nxt: 9568656
 print last
 >>> self: id(self): 140382915975120, value: 2, nxt: 140382915975120
    
risposta data 09.06.2014 - 22:12
fonte
1

È una funzionalità del linguaggio, l'istruzione = valuta l'istruzione alla sua destra e assegna quel valore alla variabile a sinistra.

In Python anche un'istruzione come a, b = 1,2 è legale. Questo si chiama incarico multiplo. Vedi documenti Python Non conosco un termine speciale per a = b = 2 struttura però. Sono solo più incarichi sulla stessa linea.

    
risposta data 20.09.2012 - 17:31
fonte

Leggi altre domande sui tag