我正在搞乱局部和全局命名空间,我发现了一些奇怪的行为。如果我这样做......
len(globals().keys())
len(locals().keys())
我得到两个不同的结果,首先我得到344然后我得到346.因此,为了好奇,我想知道哪些键在我的本地但不在我的全局,所以我这样做。
[key for key in local().keys() if key not in globals().keys()]
而bam,没有,返回一个空列表。
想想也许我的代码有问题我试试这个。
g = [1,2,3,4]
l = [1,2,3,4,5,6]
[key for key in l if key not in g]
并按预期返回[5,6]
那么,Python无法区分locals()和globals()的键的原因是什么。
是否与locals() == globals()
有关,反之亦然?
非常感谢。
答案 0 :(得分:5)
这是因为在这种情况下,您正在locals
范围内调用global
。 locals
获取当前范围内的值,而globals
返回global
范围内的所有值。这意味着,如果您在locals
范围内致电global
,它们将是相同的。例如,当您在非locals
的范围内调用global
时,会发现差异;把你的列表理解(这是好的,但有一些修改)放到一个函数中:
>>> def example(a, b, c):
... return [k for k in locals().keys() if k not in globals()]
...
>>> example(1, 2, 3)
['a', 'c', 'b']
所以,最后:是的,locals() == globals()
- 但仅限于模块级别。
答案 1 :(得分:2)
在模块级别locals() == globals()
。
您正在使用iPython。它随时随地添加到globals
。
len(locals().keys())
Out[4]: 27
len(locals().keys())
Out[5]: 29
len(locals().keys())
Out[6]: 31
len(locals().keys())
Out[7]: 33
您的列表comp会一次性评估,因此ipython没有时间将内容注入globals()
。如果你在不同的行上执行它,你会看到:
s = locals().keys()
set(locals().keys()) - set(s)
Out[2]: set(['s', '_i2'])
答案 2 :(得分:0)
你可能正在使用iPython。尝试在Python解释器或脚本上运行它,该行为将消失。