2013-07-11 72 views
3

如何將函數參數賦值給具有完全相同名稱的全局變量?我不能做self.myVariable = myVariable因爲我的功能不在類的內部。將參數賦值給具有相同名稱的全局變量

當寫下面的代碼,我得到一個錯誤,說「參數是本地和全球。」

myVar = 1 
def myFunction(myVar): 
    global myVar 

這是不可能的嗎?如果是的話,在其他語言中是不常見的?來自java我已經習慣了this.myVar = myVar

編輯我已經知道我可以重命名變量。這是簡單的方法。

回答

4

最佳解決方案:重構您的代碼。重命名一些東西,或者用對象屬性而不是全局變量來使用對象。

替代,哈克解決方案:直接修改全局變量字典:

my_var = 1 
def my_function(my_var): 
    globals()['my_var'] = my_var 
+0

哈克,我喜歡它 – Stephan

+0

附錄:不要這樣做! – user2357112

+0

太晚了!這工作正常,並且比你想象的要少得多。 – Stephan

1

最好,最快的事情將是走出採取簡單的方法,並重新命名變量(一個或多個)。但是,如果你堅持,你可以得到解決命名衝突這一點:

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一樣。

+0

你能解釋一下'sys.modules [__ name __]'嗎? – Stephan

1

答案是欺騙Python做到這一點。在您的代碼中:

myVar = 1 
def myFunction(myVar): 
    global myVar 

myFunction永遠不會運行(您永遠不會調用它)。所以,腳本永遠不會達到global myVar點。然而,由於某種原因,Python仍然爆炸。我相信那是因爲它被告知「不要允許這個」。無論如何,你可以欺騙它做你想做的。尚未提出一種方式是在myFunction的使用一個簡單的函數:

myVar = 1 
def myFunction(myVar): 
    def trick(arg): 
     global myVar 
     myVar = arg 
    trick(myVar) 

print myVar # Comes back with 1 
myFunction(22) 
print myVar # Comes back with 22 

可能無法在同一行,但你沒有導入任何東西,更容易閱讀。

+0

這就是最乾淨的解決方案了,它可以很好地處理像我需要的20多個參數,任何理由使用globals()? – Stephan

+0

@Stephan:呃,我看不到任何_technical_理由。他們的核心是做同樣的事情。但是,閱讀和維護更容易。此外,作爲Python如何給你一個全局關鍵字,Python似乎更多地使用Pythonic(至少對我來說),而不是內置的全局變量(它也可以被重新定義)。 – iCodez

相關問題