簡體   English   中英

什么是模塊變量與全局變量?

[英]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內置插件,如intzip等),只有一個全局模塊范圍 這表示您可以在模塊中訪問的所有內容。

因此,在文件的開頭,這個“粗略”表示模塊范圍:

在此輸入圖像描述

然后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小號foobar目前全球范圍的一部分。 它們仍然在my_module的全局范圍內,但您可以通過全局變量m訪問my_module的全局范圍。

在此輸入圖像描述

我在這里用AB縮寫了模塊名稱,但我希望它仍然可以理解。

全局變量是您可以在任何給定時間使用變量的地方,即使在函數或for循環中也是如此。 本地化變量在函數中定義,但不返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM