2012-07-17 49 views
0

我是python的新手。我試圖訪問模塊中定義的變量main()主要功能是imported。我想一個方法來獲得這個withput傳遞deviceid變量get_a()
main.py:-如何訪問正在導入主模塊中的變量,並在python中的main()中定義的變量

global deviceid 
import lib 
deviceid=123 
lib.get_a() 

lib.py:-

def get_a(): 
    global deviceid 
    prnit deviceid 

調用main或試圖訪問來自python shell的deviceid正在返回

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "t.py", line 4, in pp print a NameError: global name 'deviceid' is not defined

我試着給global deviceid在模塊和函數內部和外部的許多地方。沒有幫助。

有人請幫忙。

+0

已經在這裏看了,http://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-c​​reated-them '設備ID '需要在您看來正在使用的兩個模塊之外聲明*。在調用main之前,你有沒有嘗試在REPL中聲明它? – avgvstvs 2012-07-17 12:01:59

+3

而不是定義全局變量,在我看來,如果你只是將變量作爲參數傳遞,就好像這樣:'def get_a(deviceid)' – 2012-07-17 12:04:11

+0

除了dex19dt的建議,我完全支持,你將無法從'lib.py'內導入'main.py',因爲您已經導入了'main.py'。試圖這樣做會因循環依賴而失敗。 – sloth 2012-07-17 12:06:31

回答

2

Python中沒有名稱對整個程序來說是全局的。 Python中的全局語言對於特定的模塊是全球性的。要在多個模塊使用的值,你從一個模塊中導入它的名字到另一個,使得它在兩個模塊可供選擇:

# main.py 
import lib 
deviceid = 123 
lib.get_a() 

# lib.py 
import main 
def get_a(): 
    print main.deviceid 

正如其他評論者所指出的那樣,不使用全局變量可能是一個更好的選擇。

# main.py 
import lib 
deviceid = 123 
lib.get_a(deviceid) 

# lib.py 
def get_a(deviceid): 
    print deviceid 
+0

你的第一個代碼片段是危險的。它將以書面形式運行,但如果'global'是可變的,或者從'main.py'修改過,則會產生令人驚訝的效果,因爲模塊'main'和執行'main.py'腳本的模塊是兩個不同的模塊。 – Duncan 2012-07-17 13:45:05

+0

我不確定你的意思是「令人驚訝」。如果價值是要共享的,並且是可變的,那麼確實如此,您需要確保您希望每個人都能看到變化,因爲每個人都會這樣做。 – 2012-07-17 13:50:58

+1

對不起,要清楚的是:如果您運行在模塊「__main__」中運行的腳本'main.py',而運行'lib。py'導入模塊'main',因此它獲得'main.py'中定義的全局變量的單獨副本。對於不重要的不可變值,但對於列表或字典或用戶定義類的實例而言,這將很重要。這對班級本身也很重要。與你所說的相反,「令人驚訝」:*不是每個人*都會看到變化。 – Duncan 2012-07-18 07:33:12

0

你可以把設備ID變量lib模塊中,如果你這樣做lib.deviceid = X改變設備ID的價值的地方在代碼中使用它通過lib.deviceid

,如果你重新導入lib模塊別的地方,您再次請求deviceid,它將具有X作爲值。

相關問題