导入变量的可变性

时间:2017-08-30 02:46:29

标签: python python-2.7 python-import

我正在尝试对文件之间导入的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

我该怎么办?

2 个答案:

答案 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)

当您导入某些内容时,您会在导入该内容时获得该内容的版本。您导入后所做的任何更改都不会带来

唯一的解决方案(导入变量时)是在更改后重新导入该变量。

但是,您可以导入模块本身,而不是其中一个变量。这将允许您随时访问变量,因此所做的任何更改都将被跟踪。