Es un nombre temporal utilizado en una lista de comprensión por Python 2.6 y anteriores. Python 2.7 y Python 3.x arreglaron esta verruga: la lista que se está creando ya no se puede acceder hasta que la creación haya finalizado.
O en resumen, era un detalle de implementación en el que nadie debería haber confiado.
Aquí se puede ver que Python 2.7 hojas locals()
sin cambios, mientras que Python 2.6 crea una corta vida temporal:
Python 2.7.2 (default, Jan 5 2012, 16:24:09)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def foo():
t = [list(locals().keys()) for x in range(1) ]
print(locals())
print(t[0])
>>> foo()
{'x': 0, 't': [['x']]}
['x']
>>>
Python 2.6.7 (r267:88850, Jan 5 2012, 16:18:48)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def foo():
t = [list(locals().keys()) for x in range(1) ]
print(locals())
print(t[0])
>>> foo()
{'x': 0, 't': [['_[1]', 'x']]}
['_[1]', 'x']
>>>
Python 3.x introduce una nueva temporales para la lista por comprensión de vida corta llamados .0
. No tengas la tentación de usar eso para nada tampoco. También toda la lista por comprensión se ejecuta en un espacio de nombres separado para las variables de bucle no son accesibles fuera del bucle o bien:
Python 3.2 (r32:88445, Jan 5 2012, 16:29:57)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def foo():
t = [list(locals().keys()) for x in range(1) ]
print(locals())
print(t[0])
>>> foo()
{'t': [['.0', 'x']]}
['.0', 'x']
No sólo es un detalle de implementación mal, que fue retirado en Python 2.7. No lo uses – Duncan