2011-12-05 37 views
1

好的我正在做一些線程,我猜想當我開始進行線程化時,我認爲你不能像定義那樣返回值(它是一天的結束,我的大腦是即將死去,所以也許這是不正確的,我應該開始要回擺脫全局變量)全局變量和模塊(簡單示例幫助)Python

反正我有一個測試程序,以弄清楚爲什麼我不能模塊化我的代碼

一個文件名爲config .py

a_variable=0 

一個名爲test_for_sean.p的文件Ÿ

from config import * 
def blah(): 
    global a_variable 
    a_variable=14 
    return 0 

一個名爲main.py文件

from config import * 
from test_for_sean import * 
print a_variable #this prints correctly 
blah() 
print a_variable #this is still printing 0.... 

有人聯繫我的東西,所以我不殺了自己

+0

我不建議做一個'''import *'''。也許'''將test_for_sean導入爲tfs'''。這會導致各種各樣的問題 - 比如config.py是如何執行兩次的,它會填充它導入的兩個腳本的全局命名空間。 – FakeRainBrigand

+0

@FakeRainBrigand我在看這個http://www.etsimo.uniovi.es/python/infogami-faq/programming/how-do-i-share-global-variables-across-modules/是否真的錯了? –

+0

我的錯誤。我在config.py中使用''print''進行測試,它只運行一次。 – FakeRainBrigand

回答

3

嘗試這些變化,

config.py,

a_variable = 0 

tfs.py(was te st_for_sean),

import config 

def blah(): 
    config.a_variable = 14 
    return 0 

main.py,

import tfs, config 

print config.a_variable 
tfs.blah() 
print config.a_variable 

我們還是進口一切從配置,但 '全局' 變量留在自己的模塊。這樣我們就可以擁有全局變量,但是如果需要的話main.py仍然可以定義自己的a_variable

+0

我修正了上面的代碼(感謝Sean的鏈接)。現在它沒有全局性地工作。只要'''導入配置''任何地方你想要使用它。 – FakeRainBrigand

+0

工作,讓我看看如果我可以擴展它,我喜歡更好的模塊化!謝謝你,我很傷心,但我只有一個願意付出。 –

4

從模塊中導入變量時,名稱被導入當前模塊的名稱空間,它們不是在兩個模塊之間共享。關鍵字global不允許您在模塊之間共享名稱,它只允許您爲該模塊分配一個全局範圍內的名稱。

要真正共享模塊之間的變量,你需要通過它的模塊來訪問變量:

一個名爲config.py

a_variable=0 

一個名爲test_for_sean.py

import config 
def blah(): 
    config.a_variable=14 
    return 0 

文件文件一個名爲main.py的文件

import config 
from test_for_sean import blah 
print config.a_variable # prints 0 
blah() 
print config.a_variable # prints 14 
1

有一個文件系統的類比。這不是一個完美的比喻,但有助於快速瞭解問題。

模塊就像保存文件的目錄,這些文件代表變量和其他對象。在模塊中使用相對路徑。只要寫下絕對路徑,圖片就會清晰。

你的出發點是:

/my_app/module1/ 
/my_app/module1/a_variable 
/my_app/module2/ 

答:如果您在模塊2這樣做:

import a_variable from module1 

你正在變a_variable的副本:

/my_app/module1/ 
/my_app/module1/a_variable 
/my_app/module2/ 
/my_app/module2/a_variable 

在在這種情況下,當變量不可變時,它們將在第一次修改時不同步。

B.但是,當你這樣做,而不是:

import module1 

你正在創建通往變量路徑的副本:module1.a_variable

/my_app/module1/ 
/my_app/module1/a_variable 
/my_app/module2/ 
/my_app/module2/module1 -> ../module1 

結果是兩個模塊相同的變量。