2012-03-09 28 views

Respuesta

9

locals()['_[1]'] es una forma de acceder a una referencia para listar el resultado actual de comprensión (o generador) dentro de esa lista de comprensión.

Es un gran mal, pero puede producir resultados divertidos:

>> [list(locals()['_[1]']) for x in range(3)] 
[[], [[]], [[], [[]]]] 

Ver más detalles aquí: the-secret-name-of-list-comprehensions.

+9

No sólo es un detalle de implementación mal, que fue retirado en Python 2.7. No lo uses – Duncan

1

locals() de documentación de Python:

actualización y devolver un diccionario que representa la tabla de símbolos local. Las variables gratuitas son devueltas por los locales() cuando se llaman en bloques de funciones, pero no en bloques de clases.

No veo por qué se usa locals() en ese forro, quizás no sea tan general como desee.

Si usted está tratando de eliminar los duplicados de una lista creo que la mejor opción es convertirlo en un set:

In [2]: l = [1,1,3,4,2,4,6] 
In [4]: set(l) 
Out[4]: set([1, 2, 3, 4, 6]) 

Si desea una lista de nuevo:

In [5]: list(set(l)) 
Out[5]: [1, 2, 3, 4, 6] 
7

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'] 
3

Wow! Eso es un código críptico desagradable. Hizo un poco de investigación para encontrar la respuesta.

Básicamente, la lista de comprensión está construyendo una nueva lista. Nombra esta lista temporal _[1]. La parte locals() está utilizando el diccionario locals() para buscar ese nombre, ya que no se puede acceder a él de otra forma. Entonces esa línea está diciendo ...

[x for x in seq if x not in this_list] 

Cryptic.

La información encontrada en esta here