![](/img/trans.png)
[英]Python: What is the difference between a global variable, vs. a variable with the prefix “self.”, vs. a local variable?
[英]What is a module variable vs. a global variable?
來自評論 :“Python中的全局基本上意味着在模塊級別”。 但是,在名為my_module.py
的文件中運行此代碼:
import my_module as m
foo = 1
m.bar = m.foo + 1
if __name__ == "__main__":
print('foo:', foo)
print('m.foo:', m.foo)
print('m.bar:', m.bar, '\n')
for attrib in ('foo', 'bar'):
print("'{0}' in m.__dict__: {1}, '{0}' in globals(): {2}".format(
attrib,
attrib in m.__dict__,
attrib in globals()))
輸出:
foo: 1
m.foo: 1
m.bar: 2
'foo' in m.__dict__: True, 'foo' in globals(): True
'bar' in m.__dict__: True, 'bar' in globals(): False
模塊和全局命名空間究竟是什么?
為什么模塊命名空間中有__dict__
屬性但在全局命名空間中沒有?
為什么m.bar
是__dict__
一部分而不是globals()
一部分?
Python中基本上有3 種不同的范圍:
__dict__
) __dict__
中的屬性) (也許我忘了那里......)
這些工作幾乎相同,只是類范圍可以動態使用__getattr__
或__getattribute__
來模擬實際上不存在的變量的存在。 函數是不同的,因為您可以傳遞變量(使它們成為其范圍的一部分)並從函數返回它們。
但是,當您談論全局(和本地范圍)時,您必須從可見性的角度來考慮它。 沒有全局范圍 (除了像Pythons內置插件,如int
, zip
等),只有一個全局模塊范圍 。 這表示您可以在模塊中訪問的所有內容。
因此,在文件的開頭,這個“粗略”表示模塊范圍:
然后import my_module as m
,這意味着m
now現在是對my_module
的引用,並且此引用位於當前文件的全局范圍內。 這意味着'm' in globals()
將為True。
你還定義了foo=1
,它使foo
成為全局范圍的一部分,而'foo' in globals()
將為True
。 然而,這個foo
是與m.foo
完全不同的實體!
然后你做m.bar = m.foo + 1
訪問全局變量m
並根據m
s屬性foo
更改其屬性bar
。 這不會讓m
小號foo
和bar
目前全球范圍的一部分。 它們仍然在my_module
的全局范圍內,但您可以通過全局變量m
訪問my_module
的全局范圍。
我在這里用A
和B
縮寫了模塊名稱,但我希望它仍然可以理解。
全局變量是您可以在任何給定時間使用變量的地方,即使在函數或for循環中也是如此。 本地化變量在函數中定義,但不返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.