我正在尝试对文件之间导入的var进行更改。 见下面的例子:
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
尽管在file1中打印之前调用了change_string(),但仍然会读取' data1。'
我在这里缺少什么?我可以通过import语句编辑其他变量(像dicts这样的集合)。
如果我在print string
之后致电change_string()
我要打印data2
。
我该怎么办?
答案 0 :(得分:1)
简单,字符串是不可变对象;)
当您执行from file1 import string
时,您将带来 file1.py 的全局符号表导入变量时的值(或名称)模块“file1.py”上的“字符串”引用/映射到。
这样做除了在“file2.py”模块的符号表中创建了一个全新的名称,它指向一个不可更改的值。
当你这样做时:
global string
string = 'data2'
您正在做的不是更改对象'data1'( file1.py 的名称指向/映射到的对象)的值,而是创建一个新对象和将 file1.py 模块的符号表中的名称“string”重新映射到该新对象,在这种情况下为“data2”。
修改强>
您的代码实际返回'data2',因为在最终确定 file1.py 模块导入之前执行change_string()
,因此在符号中创建 string 符号之前模块表 file2.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']
答案 1 :(得分:-1)
当您导入某些内容时,您会在导入该内容时获得该内容的版本。您导入后所做的任何更改都不会带来。
唯一的解决方案(导入变量时)是在更改后重新导入该变量。
但是,您可以导入模块本身,而不是其中一个变量。这将允许您随时访问变量,因此所做的任何更改都将被跟踪。