2011-08-15 221 views
35

我希望能夠做這樣的事情:訪問模塊級變量,從模塊中的函數中

#mymodule 
var = None 

def load(): 
    var = something() 

其他模塊(S):

#secondmodule 
import mymodule 
mymodule.load() 

#thirdmodule 
from mymodule import var 
print var #Shouldn't be None 

但我不知道如何從模塊中定義的函數引用模塊變量。

這可能嗎?或者我需要在每個我不想使用它的地方發佈全球聲明。 還是我在這完全錯了?

回答

50

只要改變

def load(): 
    global var 
    var = something() 

全局變量是隻讀的,由同級方法。更準確地說,除非一個變量被指定爲全局變量,否則Python將其視爲本地變量,但如果名稱不在本地範圍內,則對本地變量名稱的讀取訪問將達到模塊級範圍。

use of 「global」 keyword in pythondoc有關global聲明

+0

有道理,工作很好,我會給你投票,但我還沒有15。謝謝。 – dennmat

+0

歡迎:) – Evpok

+0

@dennmat不要使用全局變量。如果你認爲你需要他們,通常表明你的設計存在缺陷。 – schlamar

15

更多詳情,請參閱你似乎大多擁有它。您只是錯過了「模塊級」變量在Python中被稱爲global的事實。 (他們不是真正全球性的,但只有全局聲明它們的模塊,換句話說。)

在您修改一個全局變量的任何功能(你想的名字是指不同的對象),它必須聲明爲全局的。所以你的load()函數在開始時需要一個global var。如果您只使用全局變量的值,或者它是可變類型(如列表),並且您正在修改它,但不更改名稱指向的對象,則無需將其聲明爲全局變量。

如您所發現的那樣,import聲明是如何將模塊級變量從一個模塊導入到另一個模塊的。

+0

感謝您的及時答覆,這實際上是解決方案,幫助我現在更多地瞭解全局變量和pythons。 – dennmat

+1

這回答我的疑問,'。如果您只使用全局變量的值,或者它是可變類型(如列表),並且您正在修改它,但不更改名稱指向的對象,則不需要聲明它爲全局。 @kindall! – swdev

+0

在我的情況下,我在我的方法中使用了全局變量,我沒有在任何地方改變它。在下次通話中,它是空的。不知道爲什麼。 :( –