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

cll*_*ach 3 python namespaces

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

len(globals().keys())

len(locals().keys())
Run Code Online (Sandbox Code Playgroud)

我得到两个不同的结果,首先我得到344然后我得到346.因此,出于好奇心,我想知道哪些键在我的本地但不在我的全局,所以我这样做.

[key for key in local().keys() if key not in globals().keys()]
Run Code Online (Sandbox Code Playgroud)

而bam,没有,返回一个空列表.

想想也许我的代码有问题我试试这个.

g = [1,2,3,4]

l = [1,2,3,4,5,6]

[key for key in l if key not in g]
Run Code Online (Sandbox Code Playgroud)

并按预期返回 [5,6]

那么,Python无法区分locals()和globals()的键的原因是什么.

locals() == globals()与副作用有关吗?

非常感谢.

Ale*_*ton 5

那是因为在这种情况下你要localsglobal范围内调用.而locals在当前范围内获取值,globals返回的所有值global范围.这意味着如果你localsglobal范围内打电话他们将是相同的.例如,当您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']
Run Code Online (Sandbox Code Playgroud)

所以,最后:是的,locals() == globals()- 但仅限于模块级别.