2013-07-10 3 views
65

ho creato questa funzione in Python 2.7 con ipython:Assegnare un valore a singolo trattino basso _ in Python/IPython interprete

def _(v): 
    return v 

in seguito, se chiamo _(somevalue), ottengo _ = somevalue.

in[3]: _(3) 
out[3]: 3 
in[4]: print _ 
out[4]: 3 

La funzione è scomparsa! Se chiamo _(4) ottengo:

TypeError: 'int' object is not callable` 

Perché? Cosa c'è di sbagliato in questa funzione?

+0

Possibile duplicato di [Mercurial/Python - Cosa fa la funzione Underscore?] (Http://stackoverflow.com/questions/3077227/mercurial-python-what-does-the-underscore-function-do) – dimo414

+10

@ dimo414: No, questo * non * è un duplicato di quella domanda. Tocco su quell'uso della funzione di sottolineatura nella mia risposta, ma questo è ** non ** ciò che l'OP sta chiedendo. Questo è il motivo per cui l'interprete interattivo Python ha assegnato qualcos'altro a '_'. –

+1

Hai ragione, ho capito che dopo aver postato il possibile duplicato. Dal momento che non possiamo [annullare un voto per chiudere] (http://meta.stackexchange.com/questions/915/can-we-have-the-ability-to-rescind-a-close-vote-before-it -close) Ho pensato che fosse più informativo lasciare il riferimento (le persone certamente potrebbero atterrare su questa pagina cercando una risposta alla domanda collegata, dopotutto) che rimuovere il commento. – dimo414

risposta

101

L'interprete Python assegna l'ultimo valore di espressione a _.

Questo comportamento è limitato alla sola REPL interpreter, ed è destinato ad assistere a sessioni di codifica interattive:

>>> import math 
>>> math.pow(3.0, 5) 
243.0 
>>> result = _ 
>>> result 
243.0 

Il serie interprete Python va a una certa lunghezza di non calpestare i valori definiti dall'utente però; se tu stesso assegni qualcosa a a _ allora l'interprete non lo sovrascriverà (tecnicamente parlando, lo _ variable is a __builtin__ attribute, i tuoi compiti sono globali "regolari"). Comunque non stai usando l'interprete standard di Python; stai usando IPython e quell'interprete non è così prudente.

IPython documents this behaviour explicitly:

Il seguente esistono sempre le variabili globali (in modo da non sovrascrivere loro!):

  • [_] (un singolo trattino basso): negozi di uscita precedente, come interprete di default di Python .

[...]

Fuori dell'interprete Python, _ è per convenzione usata come il nome della funzione di testo traducibili (vedere le gettext module; strumenti esterni cercare quella funzione a estrae stringhe traducibili).

In loop, utilizzando _ come destinazione di assegnazione indica ai lettori del codice che ignorerai tale valore; per esempio. [random.random() for _ in range(5)] per generare un elenco di 5 valori float casuali.

+0

cos'è una sessione di codifica interattiva? come una cosa del tipo di istruzione? – Stephan

+5

@Stephan: apertura dell'interprete python senza uno script, per provare le cose al prompt REPL. L'interprete compila le istruzioni e le esegue immediatamente, rendendo facile provare qualcosa in fretta. –

+1

@MartijnPieters Penso che il problema sia legato alla shell 'IPython' solo perché l'output è diverso nella normale shell python. –

28

_ è una variabile speciale nell'interprete, è sempre assegnata al risultato dell'espressione precedente. Quindi, non puoi usarlo in questo modo.

BTW il problema sembra essere correlato a IPython guscio, perché il codice funziona bene nel normale shell Python:

Nel normale shell Python quando si assegna nulla alla variabile _ allora rimarrò assegnata a quell'oggetto solo, e perde il suo comportamento speciale.


shell Python:

>>> 2*2 
4 
>>> _   #works as expected 
4 
>>> _ = 2  #after assignment, it's magic functionality is gone 
>>> _*5  
10 
>>> _ 
2 

IPython shell:

In IPython _ comporta diversamente rispetto shell pitone _; anche se lo si assegna ad alcune variabili, anche questo verrà aggiornato non appena si eseguono dei calcoli.

In [1]: 2*2 
Out[1]: 4 

In [2]: _ 
Out[2]: 4 

In [3]: _ = 10 

In [4]: _*10 
Out[4]: 100 

In [5]: _ 
Out[5]: 100 

Da docs di IPython:

Il seguente esistono sempre le variabili globali (in modo da non sovrascrivere loro!):

_: (un singolo trattino basso): negozi output precedente, come l'interprete predefinito di Python . ..

Da pitone docs:

L'identificatore speciale _ viene utilizzato nell'interprete interattivo per negozio il risultato dell'ultima valutazione; è memorizzato nel modulo __builtin__. Quando non è in modalità interattiva, _ non ha alcun significato speciale e non è definito.

Nota: Il nome _ è spesso usato in congiunzione con l'internazionalizzazione; fare riferimento alla documentazione per il modulo gettext per ulteriori informazioni su questa convenzione.

+0

Anche se non ho installato IPython, posso confermare che questo è il modo in cui funziona la shell interattiva normale (il CPython ufficiale?) (Nella versione 2.7.2). – 2rs2ts

-2

Se si crea una variabile assegnata a "_", viene mascherato/maschera la variabile di sistema _.

+2

Quale variabile di sistema '_' potrebbe essere? –