[英]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.