您正在查看模塊名稱空間。 f()
全局變量與g()
全局變量不同,因爲它們都生活在不同的模塊中。
你會看到同樣的全局命名空間,如果你使用vars()
(在main
全局)和vars(a)
(用於模塊a
的全局):
print(sorted(vars(a).keys() - vars()))
# prints ['__initializing__', 'f'], only `a` has `f` defined, the `__initializing__` value is a flag used by the import machinery
print(sorted(vars().keys() - vars(a)))
# prints ['a', 'g'], only `main` has imported `a` and defined function `g`
每個模塊都有自己的命名空間,globals()
不是全局的解釋器,它們只是模塊全局。導入模塊意味着您正在導入對該名稱空間的引用,或者創建對名稱空間的名稱的引用。
從datamodel documentation上模塊對象:
模塊對象具有由字典對象實現的名字空間(這是由__globals__
屬性的功能的模塊中定義的參考的詞典)
和功能對象:
__globals__
:對保存函數的全局變量 - 定義函數的模塊的全局名稱空間。
主要腳本的__builtins__
關鍵僅僅指向__builtins__
模塊,在被導入模塊已擴大成一個字典。這些都是一樣的,真的。
我不知道這是否真的回答了爲什麼導入函數的'__globals__'應該包含所有內建函數。 – geoffspear
@Wooble:我發現在'g()'全局變量中不存在更多的'f()'全局變量鍵,除了期望值之外。 –