2012-03-09 18 views

Odpowiedz

9

locals()['_[1]'] jest sposób na dostęp do odniesienia do zrozumienia ze zrozumieniem listy (lub generatora) bieżącego wyniku wewnątrz tego spisu.

Jest całkiem zła, ale może produkować śmieszne wyniki:

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

Zobacz więcej szczegółów tutaj: the-secret-name-of-list-comprehensions.

+9

Nie tylko jest to zły szczegółów wdrażania, został usunięty w Pythonie 2.7. Nie używaj go. – Duncan

1

locals() z docs Pythona:

Update i powrócić słownik reprezentujący lokalnej tablicy symboli. Darmowe zmienne są zwracane przez locals(), gdy są wywoływane w blokach funkcyjnych, ale nie w blokach klasy.

Nie rozumiem, dlaczego locals() jest używany w tej jednej linii, może nie jest tak ogólny, jak chcesz.

Jeśli próbujesz usunąć duplikaty z listy Myślę, że najlepszym wyborem jest przekształcić go w set:

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

Jeśli chcesz ponownie listę:

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

Jest to nazwa tymczasowa używana w zrozumieniu list przez Python 2.6 i wcześniej. Python 2.7 i Python 3.x naprawiły tę brodawkę: tworzona lista nie jest już dostępna, dopóki tworzenie się nie zakończy.

W skrócie był to szczegół wdrożenia, na który nikt nigdy nie powinien polegać.

Tutaj można zobaczyć, że Python 2.7 liści locals() niezmienione podczas Python 2.6 tworzy krótki żywo tymczasowa:

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 wprowadza nowy krótkotrwałe tymczasowe dla listowych nazywa .0. Nie ulegaj pokusie, aby użyć tego do czegokolwiek. Również cała lista rozumienie prowadzi w oddzielnej przestrzeni nazw tak zmienne pętlowe nie są dostępne poza pętlą albo:

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! To złośliwy, tajemniczy kod. Trochę badań zajęło znalezienie odpowiedzi.

Zasadniczo zrozumienie listy tworzy nową listę. Nazwa tej tymczasowej listy to _[1]. Część locals() używa właśnie słownika locals(), aby wyszukać tę nazwę, ponieważ nie jest dostępna w inny sposób. Ta linia mówi ...

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

Cryptic.

Wykryta informacja o tym here