导入变量的可变性
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']
当您导入某些内容时,您会在导入时获得该内容的版本。导入后所做的任何更改将不会继续。
唯一的解决方案(导入变量时)是在进行更改后重新导入该变量。
但是,您可以导入模块本身,而不是其中的一个变量。这将允许您随时访问变量,因此所做的任何更改都会被跟踪。
我正在尝试在文件之间对导入的 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']
当您导入某些内容时,您会在导入时获得该内容的版本。导入后所做的任何更改将不会继续。
唯一的解决方案(导入变量时)是在进行更改后重新导入该变量。
但是,您可以导入模块本身,而不是其中的一个变量。这将允许您随时访问变量,因此所做的任何更改都会被跟踪。