导入变量的可变性

Mutability of imported variable

我正在尝试在文件之间对导入的 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() 之前在 file2 中打印它,该值仍然显示为 'data1.'

我在这里错过了什么?我可以通过 import 语句编辑其他变量(dict 等集合)。

如果我在 change_string() 之后调用 print string 我想打印 data2.

我该如何做我想做的事?

简单,字符串是 immutable 对象 ;)

当您执行 from file1 import string 时,您将使用 file1.py 全局符号 table 在模块 "file1.py" 上导入变量(或名称)"string" 时的值是 referencing/mapping-to.

这样做,除了 "file2.py" 模块的符号 table 之外,您正在创建一个全新的名称,它指向一个无法更改的 immutable 值。

当你这样做时:

global string
string = 'data2'

您正在做的不是更改对象 'data1' 的值(file1.py 的名称是 pointing/mapped-to at),但创建一个新对象并将 file1.py 模块的符号 table 中的名称 "string" 重新映射到该新对象,"data2" 在这种情况下。

编辑:

你的代码实际上 return 'data2' 因为 change_string() 在完成 file1.py 模块导入之前执行,所以在创建之前模块 file2.py 的符号 table 中的 string 符号。我只是更改此示例中的代码以说明我猜您指的问题:在导入后调用 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']

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

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

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