簡體   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