Mer*_*glu 12 python syntax list
我看到了一个声称从序列中删除重复项的单行代码:
u = [x for x in seq if x not in locals()['_[1]']]
Run Code Online (Sandbox Code Playgroud)
我尝试了ipython(使用Python 2.7)中的代码 KeyError: '_[1]'
是否['_[1]']意味着在Python一些特别的东西?
Rom*_*huk 10
locals()['_[1]'] 是一种在列表理解中访问列表理解(或生成器)当前结果的引用的方法.
这是一个很邪恶,但可以产生有趣的结果:
>> [list(locals()['_[1]']) for x in range(3)]
[[], [[]], [[], [[]]]]
Run Code Online (Sandbox Code Playgroud)
在这里查看更多详细信息:秘密名称列表的理解.
它是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']
>>>
Run Code Online (Sandbox Code Playgroud)
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']
Run Code Online (Sandbox Code Playgroud)