繁体   English   中英

Python locals()和globals()是一样的吗?

[英]Python locals() and globals() are the same?

我正在搞乱局部和全局命名空间,我发现了一些奇怪的行为。 如果我这样做......

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()和反之吗?

非常感谢。

那是因为在这种情况下,您在global范围内调用locals 尽管locals在当前范围内获取值,但globals返回global范围中的所有值。 这意味着如果您在global范围内调用locals ,它们将是相同的。 例如,当您在非global范围内调用locals时,会发现差异; 把你的列表理解(这可以但是做一些修改)放到一个函数中:

>>> 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() - 但仅限于模块级别。

在模块级别, locals() == globals()

您正在使用iPython。 随着时间的globals ,它会向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'])

你可能正在使用iPython。 尝试在Python解释器或脚本上运行它,该行为将消失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM