2016-09-24 187 views
0

它是一套Python腳本。但是,我更新全局變量時遇到了問題。python更新全局變量

# A.py 

data = [[]] # global data 

def work1(list): 
    data.append(list) 

def work3(): 
    print (data) 


# B.py 
from A import work1 

def work2(): 
    for each in input: 
     work1(each) # call work1 


# C.py 
from A import work3 

def work4(): 
    work3() # call work3 

「data」是一個列表,其中有長長的句子。 如果沒有「work2」,則不會調用「work4」。

但是,在「work3」中,「data」始終爲空,未更新,爲[[[]]' 我該如何解決這個問題? (Python版本3.4.4是)

+0

我不能夠正確地遵循。你的預期輸出是什麼,你會得到什麼?因爲只調用work3()將總是返回空。從A導入work3將複製c.py中的work3。 – Cyclotron3x3

+0

有一個調用work2()和work4()的主函數。當然,還有其他一些人在這些職能上工作,但是,我沒有描述細節。重點是全球數據沒有向其他模塊顯示一些更新的內容。 (它在模塊中顯示正確的更新數據,我的意思是聲明全局變量的地方) –

回答

0

創建一個獨立的文件,你的所有全局值

#globals.py 

class MyGlobals(object): 
    data = [[]] # global data 

#c.py 

from globals import MyGlobals 

def work1(list): 
    MyGlobals.data.append(list) 

def work3(): 
    print (MyGlobals.data) 

#b.py 

from globals import MyGlobals 
import c 

input = [[1, 3, 4], [2, 4, 4], [3, 4, 5]] 

def work2(): 
    for each in input: 
     C.work1(each) # call work1 

#a.py 

from globals import MyGlobals 
import c 

def work4(): 
    c.work3() # call work3 

if __name__ == "__main__": 
    work4(); 

輸出

sh-4.3$ python a.py                                                          
[[]]                                                             
sh-4.3$ 

如果你現在要更新您的全局值,你可以調用內部

#a.py 

from globals import MyGlobals 
import c 
import b 

def work4(): 
    c.work3() # call work3 

if __name__ == "__main__": 
    b.work2() 
    work4() 

輸出在文件b.py WORK2()函數
sh-4.3$ python a.py                                                          
[[], [1, 3, 4], [2, 4, 4], [3, 4, 5]]                                                     

有一個空的列表中輸出,因爲我不知道你想怎麼存儲它們,因爲有你追加到全球數據,即數據的現有空列表= [[]]

使其按照您的要求工作。將全局list放入一個文件中,並將該文件導入到您要使用它的每個其他模塊/文件中。

#a.py 

data = [[]] # global data 

#b.py 

import a 

def work1(list): 
    a.data.append(list) 

def work3(): 
    print (a.data) 

#c.py 

import a 
import b 

input = [[1, 3, 4], [2, 4, 4], [3, 4, 5]] 

def work2(): 
    for each in input: 
     b.work1(each) # call work1 

#main.py 

import a 
import b 
import c 

def work4(): 
    b.work3() # call work3 

if __name__ == "__main__": 
    c.work2() 
    work4() 

輸出

sh-4.3$ python main.py                                                         
[[], [1, 3, 4], [2, 4, 4], [3, 4, 5]]  
sh-4.3$                                                   
+0

我應該使用「class」嗎?我不熟悉「類」,我只需要一個可以從其他模塊訪問的數據插槽,所以我只是聲明一個「列表」爲全局。但是,要解決這個問題,我應該使用一個類? –

+0

對不起,我完全忘記說謝謝你,非常感謝你的幫助! –

+0

不,你不需要使用課堂來讓它按照你的方式工作。等待更新的答案 – Cyclotron3x3