2011-08-17 60 views
1

因爲如果變量名稱在函數中被賦值給它們,並且我想從函數內部訪問模塊變量,那麼我可以在模塊中導入模塊名稱,然後使用它來訪問模塊變量?python:我可以在模塊本身內導入模塊名稱空間嗎?

實例(文件名:server.py):

import server 

bar = 5 

def foo(): 
    server.bar = 10 
+0

你不想只訪問,你想改變它們。那麼自然會產生這樣的問題:你爲什麼要這樣做,而不是使用''global''語句,而這恰恰是爲了允許這樣做呢? – eyquem

+0

您對「變量」一詞的使用不正確。在其他語言中有變量,這個詞是從內存的_chunk像一個盒子,其內容可以改變的意義上被採用的,但不是在Python中。 Python中沒有盒子變量,_all是object_。 Python中單詞'variable'的唯一可接受的用法是指定對象的名稱,這是我在官方文檔中看到的唯一含義。但有一個特定的詞:'標識符'。所以沒有理由在Python上下文中使用含糊不清的混淆詞「變量」。 – eyquem

+0

_你不想只訪問,你想改變他們,說我。但這是我的假設。事實上,你的代碼的動機是未知的,因爲它是不完整的。你想用'server.bar = 10''指令獲得什麼? 「爲什麼?'是理解你想獲得的東西的第二要素 – eyquem

回答

5

除了使用global聲明,在所有其他的答案中建議,不使用模塊但是作爲容器的一個類或者僅用於全局的另一個模塊:

# mg.py 

bar = 5 

# server.py 
import mg 

def foo(): 
    mg.bar = 10 

class mg: 
    bar = 5 

def foo(): 
    mg.bar = 10 

這樣你就不需要把global語句隨處可見,你可以重新使用這些名稱,很明顯你指的是哪個bar

編輯:此外,可以在模塊內部導入模塊,但不能以這種方式更改主模塊中的變量。因此,這會工作:

# selfimport.py 
import selfimport 

def foo(): 
    print selfimport.foo 

bar = 3 

if __name__ == '__main__': 
    print selfimport.bar 
    foo() 

但這並不:

# selfimport.py 
import selfimport 

bar = 3 

def foo(): 
    selfimport.bar = 5 

if __name__ == '__main__': 
    print selfimport.bar 
    foo() 
    print bar # bar is still 3! 

如果你只使用全局常數,你就不需要global聲明反正。您還需要確保在上面的if語句中僅包含您想要在主模塊中執行的代碼,否則您將進行遞歸。

+0

+1不使用全球! – rubik

+0

因此,不建議隱式使用全局變量,而是隱藏它並依靠隱式機制。我傾向於認爲這是一種有害的建議。 –

+1

不,我建議你不要使用全局變量___,並且通過使用屬性訪問表示法(而不是__implicitly__,而不是在範圍內分配__implicitly__時引用這些變量__explicitly__,就像使用全局變量一樣)。 – agf

1

不能導入它這樣,你不需要。直接使用模塊全局變量。

def foo(): 
    global bar 
    bar = 10 

你需要聲明它是全局的,所以它被設置,而不是創建一個局部變量。

+0

這是錯誤的,你可以像那樣導入(不是你應該的)。 – agf

+0

技術上你可以,但你可以通過這樣做得到一些非常奇怪的結果。所以你不能這樣做,並期望它能100%可靠地工作。 – Keith

+0

我不確定你的意思是什麼,如果你按照我的建議去做,並且你只想在'if __name__ =='__main __''的主模塊中使用代碼,你應該怎麼做? – agf

1

爲什麼不:

def foo(): 
    global bar 
    bar = 10 
0

沒有,而不是使用全局聲明:

def foo(): 
    global bar 
    bar = 10 
相關問題