2012-03-09 89 views

回答

9

locals()['_[1]']是在列表理解中訪問對列表理解(或生成器)當前結果的引用的方式。

這是很邪惡,但能產生有趣的結果:

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

在這裏看到更多的細節:the-secret-name-of-list-comprehensions

+9

它不僅是一個邪惡的實現細節,它是在Python 2.7版刪除的信息。不要使用它。 – Duncan 2012-03-09 10:06:18

1

locals()從Python文檔:

更新,並返回來表示當前本地符號表的字典。在函數塊中調用時,由locals()返回自由變量,但不在類塊中調用。

我看不出爲什麼locals()用於那一個班輪,也許它不像你想要的一般。

如果你想從列表中刪除重複我認爲最好的選擇是將其轉換爲一個set:如果您想再次名單

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

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

它是Python 2.6及更早版本在列表理解中使用的臨時名稱。 Python 2.7和Python 3.x解決了這個問題:在創建完成之後,創建的列表將不再可用。

簡而言之,這是一個沒有人應該依賴的實現細節。

在這裏你可以看到,Python 2.7版葉locals()不變,而Python 2.6創建一個短現場臨時:

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中引入了一個新的短命的臨時列表推導稱爲.0。不要試圖將它用於任何事情。此外整個列表理解運行在一個單獨的命名空間,因此循環變量無法在循環外訪問:

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

哇!這是非常神祕的代碼。花了一些研究來找到答案。

基本上列表理解是建立一個新的列表。它命名這個臨時名單_[1]locals()部分僅使用locals()字典來查找該名稱,因爲否則無法訪問該名稱。這條線說...

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

神祕。

的發現這個here