最好,最快的事情將是走出採取簡單的方法,並重新命名變量(一個或多個)。但是,如果你堅持,你可以得到解決命名衝突這一點:
import sys
_global = sys.modules[__name__]
# or _globals = sys.modules[__name__].__dict__
myVar = 1
def myFunction(myVar):
_global.myVar = myVar # or _globals['myVar'] = myVar
print myVar # 1
myFunction(42)
print myVar # 42
說明:
中的模塊,該模塊的名字(作爲一個字符串)可以作爲全局的價值變量__name__
。名稱sys.modules
指的是將模塊名稱映射到已經加載的模塊的字典。如果myFunction()
正在運行,則其模塊已被加載,因此當時sys.modules[__name__]
是其中定義的模塊。由於全局變量MyVar
也在模塊中定義,所以可以使用sys.modules[__name__].myVar
訪問它。 (爲了它的使用與Java類似,你可以將其命名爲this
- 但我個人認爲_global
是一個更好的)
此外,由於模塊的只讀__dict__
的屬性是它的命名空間 - 又名全局命名空間 - 表示爲字典對象,sys.modules[__name__].__dict__
是引用它的另一種有效方式。
請注意,無論哪種情況,如果對不存在的名稱進行分配,將會創建新的全局變量 - 就像使用關鍵字global
一樣。
哈克,我喜歡它 – Stephan
附錄:不要這樣做! – user2357112
太晚了!這工作正常,並且比你想象的要少得多。 – Stephan