significa - Asignación de un valor al guion bajo simple_en el intérprete de Python/IPython
guion bajo en python (3)
El intérprete de Python asigna el último valor de expresión a _
.
Este comportamiento está limitado al intérprete REPL únicamente, y está destinado a ayudar en las sesiones de codificación interactiva:
>>> import math
>>> math.pow(3.0, 5)
243.0
>>> result = _
>>> result
243.0
El intérprete estándar de Python va bastante lejos para no pisotear los valores definidos por el usuario; si usted mismo asigna algo más a _
entonces el intérprete no sobrescribirá eso (técnicamente hablando, la variable _
es un atributo __builtin__
, sus propias asignaciones son globales "regulares"). Sin embargo, no estás usando el intérprete estándar de Python; estás usando IPython, y ese intérprete no es tan cuidadoso.
IPython documenta este comportamiento de forma explícita :
Las siguientes variables GLOBALES siempre existen (¡así que no las sobrescriba!):
[_]
(un guion bajo): almacena el resultado anterior, como el intérprete predeterminado de Python.[...]
Fuera del intérprete de Python, _
se usa por convención como el nombre de la función de texto traducible (consulte el módulo gettext
; las herramientas externas buscan esa función para extraer cadenas traducibles).
En los bucles, usar _
como un objetivo de asignación le dice a los lectores de tu código que vas a ignorar ese valor; ej. [random.random() for _ in range(5)]
para generar una lista de 5 valores de flotación aleatorios.
ipython
esta función en Python 2.7 con ipython
:
def _(v):
return v
más tarde si llamo _(somevalue)
, obtengo _ = somevalue
.
in[3]: _(3)
out[3]: 3
in[4]: print _
out[4]: 3
¡La función ha desaparecido! Si llamo _(4)
obtengo:
TypeError: ''int'' object is not callable`
¿Por qué? ¿Qué pasa con esta función?
Si crea una variable asignada a "_", se enmascara / enmascara la variable del sistema _.
_
es una variable especial en intérprete, siempre se asigna al resultado de la expresión previa. Entonces, no deberías usarlo así.
Por cierto, el problema parece estar relacionado con el shell de IPython, porque tu código funciona bien en el shell de python normal:
En el shell normal de Python cuando se asigna algo a la variable _
, seguirá asignado a ese objeto únicamente, y pierde un comportamiento especial.
Shell de Python:
>>> 2*2
4
>>> _ #works as expected
4
>>> _ = 2 #after assignment, it''s magic functionality is gone
>>> _*5
10
>>> _
2
Shell de IPython :
En IPython, _
comporta de manera diferente que el _
del shell de python; incluso si lo asigna a alguna variable, también se actualizará tan pronto como realice algún cálculo.
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
De los documentos de IPython:
Las siguientes variables GLOBALES siempre existen (¡así que no las sobrescriba!):
_: (un guion bajo): almacena el resultado anterior, como el intérprete predeterminado de Python. ..
De los docs Python:
El identificador especial
_
se usa en el intérprete interactivo para almacenar el resultado de la última evaluación; está almacenado en el módulo__builtin__
. Cuando no está en modo interactivo,_
no tiene un significado especial y no está definido.Nota : El nombre
_
se usa a menudo junto con la internacionalización; consulte la documentación del módulo gettext para obtener más información sobre esta convención.