2017-08-30 48 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'。 –