2015-12-09 99 views
3

當涉及到使用其他包的包時,我對全局變得有點困惑。從快速谷歌搜索;沒有多少解釋。Python - 全球有什麼優先權?

簡而言之:當使用global時,在什麼級別是變量「全球化」?它處於模塊級別,包級別還是解釋器級別?即,在設置如此:

<Package> 
    |- __init__.py 
    |- Module.py 
    |- Module2.py 

和有內Module.py使用global statment,是全球化爲只是模塊的變量,或整個包(包括Module2.py和或__init__。 py)或者interperter級別(任何在解釋器中運行的任何東西)。

此外,如果在__init__.py I from .Module import *中,包含全局語句的導入函數是否將該文件的所有變量「正確全局化」?

+1

見[6.13'global'聲明】(https://docs.python.org/2/reference/simple_stmts.html#global)。總之,'global'語句隻影響** **範圍內它是在使用。另請參閱相關的部分6.2賦值語句(https://docs.python.org/2/reference/simple_stmts.html#賦值語句)它如何影響賦值。 –

回答

6

全球變數是多少?

Python中所謂的「全局」變量實際上是模塊級別的。實際上有全局全局變量,它們位於Python 2中的__builtin__模塊或Python 3中的builtins,但不應該觸及這些全局變量。 (另外,還要注意的s的存在或缺乏。__builtins__是它自己的奇怪的事情。)

什麼是global說法嗎?

global表態意味着,只是在它出現功能,指定變量名稱或名稱指的是「全球」(模塊級)變量(S),而不是局部變量。

import *怎麼樣?

哦,上帝,不要那樣做。 Globals已經夠糟了,但是導入它們會更糟糕,並且使用import *這樣做幾乎是你能做到的最糟糕的方式。導入系統對全局變量所做的事情對於新程序員來說是非常令人驚訝的,而且幾乎從來都不是你想要的。

當你做import *,這並不意味着你的模塊開始在導入模塊的全局變量中查找變量查找。這意味着Python在導入的模塊中查找,找到其「公共」全局變量*,並將其當前值分配給,並在當前模塊中命名爲新的全局變量

這意味着您的新全局變量的任何賦值都不會影響原始文件,並且對原文的任何賦值都不會影響您的新變量。您使用import *導入的任何功能仍在查看原始變量,因此它們不會看到您對副本所做的更改,也不會看到他們對其所做的更改。結果是一團混亂。

嚴重的是,如果您絕對必須使用另一個模塊的全局變量,請使用import othermodule語法將其導入,並使用othermodule.whatever_global訪問全局變量。


*如果模塊定義了一個__all__列表中,「公共」全局的名字出現在該列表中的變量。否則,它們是名稱不以下劃線開頭的變量。已知函數被存儲在普通變量中,所以這些函數被包含在與其他變量相同的條件下。