我看到聲稱remove duplicates from a sequence一個襯墊代碼:在Python中locals()['_ [1]']是什麼意思?
u = [x for x in seq if x not in locals()['_[1]']]
我試過代碼IPython中(與Python 2.7),它給了KeyError: '_[1]'
是否['_[1]']
意味着在Python一些特別的東西?
我看到聲稱remove duplicates from a sequence一個襯墊代碼:在Python中locals()['_ [1]']是什麼意思?
u = [x for x in seq if x not in locals()['_[1]']]
我試過代碼IPython中(與Python 2.7),它給了KeyError: '_[1]'
是否['_[1]']
意味着在Python一些特別的東西?
locals()['_[1]']
是在列表理解中訪問對列表理解(或生成器)當前結果的引用的方式。
這是很邪惡,但能產生有趣的結果:
>> [list(locals()['_[1]']) for x in range(3)]
[[], [[]], [[], [[]]]]
在這裏看到更多的細節:the-secret-name-of-list-comprehensions。
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]
它是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']
哇!這是非常神祕的代碼。花了一些研究來找到答案。
基本上列表理解是建立一個新的列表。它命名這個臨時名單_[1]
。 locals()
部分僅使用locals()
字典來查找該名稱,因爲否則無法訪問該名稱。這條線說...
[x for x in seq if x not in this_list]
神祕。
的發現這個here
它不僅是一個邪惡的實現細節,它是在Python 2.7版刪除的信息。不要使用它。 – Duncan 2012-03-09 10:06:18