2017-08-30 53 views
0

我想對文件之間的導入變量進行更改。 參見下例:導入變量的可變性

file1.py

string = 'data1' 

def change_string(): 
    global string 
    string = 'data2' 

#this does not update string in file2 
change_string() 

file2.py

from file1 import string 

#this prints initial value of string, regardless of change_string() function called in file1 
print string 

儘管file2中的值打印它仍然讀取之前調用file1中CHANGE_STRING() 'DATA1'。

我在這裏錯過了什麼?我可以通過導入語句編輯其他變量(如字典等集合)。

如果我撥打print stringchange_string()我想打印data2

我該怎麼做我想做的事?

+2

我在測試後得到了「data2」。 – stamaimer

+1

python 2或3? – MaNKuR

+1

@MaNKuR應該是Python 2.'打印字符串'不允許在Python 3中。 –

回答

1

簡單,字符串是不可變對象;)

當你做from file1 import string你把你的file1.py全局符號表值,在進口變量的時刻(或名稱)模塊「file1.py」中的「字符串」是引用/映射到。

這樣做,除了在「file2.py」模塊的符號表中,還創建了一個全新的名稱,指向不可改變的值。

當你這樣做:

global string 
string = 'data2' 

你在做什麼是不會改變的對象「DATA1」的值(指其file1.py名字被指向/映射到的) ,但創建一個新對象並將模塊的符號表中的名稱「字符串」重新映射到該對象的新對象「data2」。

編輯:

你的代碼實際上返回「數據2」,因爲change_string()被敲定file1.py模塊導入之前執行,所以在模塊文件2的符號表之前創建符號.py。我只是在這個例子中改變你的代碼來說明我猜你是指的問題:在導入不改變數據後調用change_string()

file1.py

conf = {'string': 'data1'} 

def change_string(): 
    global conf 
    conf['string'] = 'data2' 

file2.py

from file1 import conf, change_string 

change_string() 
print conf['string'] 
+0

D'oh,我知道這是我忽略的東西。 我該如何讓這種行爲像我想要的?把字符串放在容器中? 這似乎是我想要做的事情會花費過多。 –

+0

是的,你必須使用可變對象。我認爲一個簡單的字典不是那麼糟糕;) –

+1

@stamaimer是的,這就是爲什麼我說:「你的代碼實際上返回'data2',因爲change_string()在最終化file1.py模塊導入之前執行」。 –

-1

當你輸入的東西,你在你導入它的那一刻得到的那個東西的版本。您輸入後所做的任何更改將不會結轉

唯一的解決方案(導入變量時)是在更改後重新導入該變量。

但是,您可以導入模塊本身,而不是其中一個變量。這將允許您隨時訪問變量,因此所做的任何更改都會跟蹤。

+0

@stamaimer:是的。它輸出'data2'。 –