2009-10-08 11 views

risposta

43

Nel Python REPL standard _ rappresenta l'ultimo valore restituito - nel punto in cui hai chiamato len(_), _ era il valore 'abc'.

Ad esempio:

>>> 10 
10 
>>> _ 
10 
>>> _ + 5 
15 
>>> _ + 5 
20 

Questa è gestita da sys.displayhook, e la variabile _ va in builtins spazio dei nomi con le cose come int e sum, motivo per cui non si poteva trovare in globals().

Si noti che non esiste tale funzionalità all'interno degli script Python. In uno script, _ non ha alcun significato speciale e non verrà impostato automaticamente sul valore prodotto dall'istruzione precedente.

Inoltre, fate attenzione di riassegnazione _ nel REPL se si desidera utilizzarlo come sopra!

>>> _ = "underscore" 
>>> 10 
10 
>>> _ + 5 

Traceback (most recent call last): 
    File "<pyshell#6>", line 1, in <module> 
    _ + 5 
TypeError: cannot concatenate 'str' and 'int' objects 

Questo crea una variabile globale che nasconde la variabile _ nel built-in. Per annullare l'assegnazione (e rimuovere la _ da globali), dovrete:

>>> del _ 

quindi la funzionalità sarà di nuovo al normale (la builtins._ sarà di nuovo visibile).

+7

FYI: REPL è l'abbreviazione di Read-Eval-Print Loop. Come sempre, wikipedia ha più informazioni se lo vuoi. http://en.wikipedia.org/wiki/Read-eval-print_loop –

+0

Che cosa è un "run-of-the-mill identificatore"? La ricerca rapida ha dato come risultato "semplicemente media, comune, mediocre" - cosa significa "_" negli script Python? – user937284

+0

@ectomorph aggiornato per chiarire. –

17

Perché non si può vedere? E 'in __builtins__

>>> __builtins__._ is _ 
True 

Quindi non è né globale né locale.

E dove si svolge questo incarico? sys.displayhook:

>>> import sys 
>>> help(sys.displayhook) 
Help on built-in function displayhook in module sys: 

displayhook(...) 
    displayhook(object) -> None 

    Print an object to sys.stdout and also save it in __builtin__. 

2012 Edit: Lo definirei "superglobali" dal __builtin__ s' membri sono disponibili ovunque, in qualsiasi modulo.

+1

Perché qualcosa è utilizzabile solo in REPL ma non negli script inseriti in __builtin__? – user937284

2

Di solito, stiamo usando _ in Python per legare una funzione ugettext.

+1

anche questo è vero, ma solo per le applicazioni Python. 'gettext.install' si legherà a' __builtins __._ ', in modo che sia disponibile senza importare in tutte le applicazioni; quindi lo stesso tipo di nome "magico". – u0b34a0f6ae

Problemi correlati