如果我
from file import variable
并且varable
在模块文件中更改了variable
s 值不会更新。如果我
import file
变量file.variable
已更新。
有没有办法从模块中选择性地导入变量,将它们放在模块本地范围内并反映更新。
如果我
from file import variable
并且varable
在模块文件中更改了variable
s 值不会更新。如果我
import file
变量file.variable
已更新。
有没有办法从模块中选择性地导入变量,将它们放在模块本地范围内并反映更新。
不,在 Python 中,所有变量都是对象的引用(指针)。简单的分配 重新绑定被分配的名称——它们将它们指向不同的对象。也就是说,如果您有两个名称a
和b
,它们指向同一个对象,例如42
,而您分配b
给不同的对象,例如"Don't Panic"
,a
仍然指向42
。
a = b = 42
b = "Don't Panic"
print a
无论涉及的名称是在同一个模块中还是在不同的模块中,这都是正确的。
如果您不希望出现此行为,请不要为同一对象使用其他名称。正如您所发现的,您应该import file
以file.variable
而不是from file import variable
. 后者相当于:
import file
variable = file.variable
del file
因此,在幕后,from ... import
正在分配一个新名称。该名称与其已有的名称相同,但它位于不同的范围内,并且是对该对象的新引用。
另一种可能的解决方案是使用可变对象,这样您就不需要进行简单的分配。例如,如果a
是一个列表,那么您可以随意修改a[0]
等等a[2]
,而无需更改a
指向的内容。您甚至可以重新分配对象的全部内容,而无需重新绑定名称:a[:] = [1, 2, 3]
. 由于您正在更改对象本身,而不是任何名称所指向的内容,因此可以通过任何名称看到更改。