从文件导入变量创建变量的副本

2022-03-31 00:00:00 python python-import

问题描述

如果我

from file import variable

并且模块文件中的varable被更改,variable的值不会更新。 如果我

import file

变量file.variable已更新。

有没有办法选择性地从模块导入变量,将它们放在模块的本地作用域中并反映更新。


解决方案

否。在Python中,所有变量都是对对象的引用(指针)。中的简单赋值重新绑定被分配的名称-它们将它们指向不同的对象。也就是说,如果您有两个名称,<[2-3]和b,指向相同对象,例如42,而您将b分配给不同对象,则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]。由于您更改的是对象本身,而不是任何名称所指向的对象,因此可以通过任何名称查看更改。

相关文章