我看到了remove duplicates from a sequence声称的单行代码:
u = [x for x in seq if x not in locals()['_[1]']]
我在ipython(使用Python 2.7)中尝试了该代码,它给了KeyError: '_[1]'
['_[1]']
是否意味着Python中的一些特殊内容?
答案 0 :(得分:9)
locals()['_[1]']
是一种在列表理解中访问列表理解(或生成器)当前结果的引用的方法。
这是一个非常邪恶,但可以产生有趣的结果:
>> [list(locals()['_[1]']) for x in range(3)]
[[], [[]], [[], [[]]]]
在此处查看更多详情:the-secret-name-of-list-comprehensions。
答案 1 :(得分: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']
答案 2 :(得分:3)
哇!这是彻头彻尾的神秘代码。进行了一些研究以找到答案。
基本上,列表理解是建立一个新列表。它命名此临时列表_[1]
。 locals()
部分只是使用locals()
字典来查找该名称,否则无法访问该名称。所以这条线说......
[x for x in seq if x not in this_list]
隐秘。
找到有关此here
的信息答案 3 :(得分:1)
locals()
:
更新并返回表示当前本地符号表的字典。当在函数块中调用时,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]