2012-03-09 16 views

risposta

9

locals()['_[1]'] è un modo per accedere a un riferimento al risultato corrente di comprensione (o generatore) di elenchi all'interno di tale comprensione di lista.

E 'del tutto un male, ma può produrre risultati divertenti:

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

Mostra altri dettagli qui: the-secret-name-of-list-comprehensions.

+9

Non solo è un dettaglio di implementazione del male, è stato rimosso in Python 2.7. Non usarlo – Duncan

1

locals() da docs Python:

Update e restituisce un dizionario rappresentante la corrente tabella dei simboli locale. Le variabili libere vengono restituite dai locals() quando vengono richiamate nei blocchi funzione, ma non nei blocchi di classe.

Non riesco a capire perché lo locals() sia utilizzato in quella fodera, forse non è così generico come si desidera.

Se stai cercando di rimuovere i duplicati da un elenco Penso che la scelta migliore è convertirlo in un set:

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

Se si vuole ancora una volta un elenco:

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

È un nome temporaneo utilizzato in una list comprehension di Python 2.6 e precedenti. Python 2.7 e Python 3.x hanno risolto questo problema: l'elenco creato non è più accessibile fino al completamento della creazione.

In breve, era un dettaglio di implementazione a cui nessuno avrebbe mai dovuto fare affidamento.

Qui potete vedere che Python 2.7 foglie locals() immutato, mentre Python 2.6 crea un breve dal vivo temporanea:

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 un nuovo breve temporanei per la lista comprensioni vissuto chiamati .0. Non essere tentato di usarlo per niente. Anche l'elenco intero di comprensione viene eseguito in uno spazio dei nomi separato in modo le variabili di loop non sono accessibili al di fuori del ciclo sia:

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! È un codice decisamente criptico. Ho preso un po 'di ricerca per trovare la risposta.

Fondamentalmente la comprensione delle liste sta costruendo una nuova lista. Nomina questo elenco temporaneo _[1]. La parte locals() sta usando il dizionario locals() per cercare quel nome, in quanto non è accessibile altrimenti. Quindi quella frase sta dicendo ...

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

criptico.

Il trovato informazioni su questo here