locals()['_ [1]']在Python中意味着什么?

时间:2012-03-09 09:34:12

标签: python list syntax

我看到了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中的一些特殊内容?

4 个答案:

答案 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)

来自Python文档的

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]