2024-10-06 12:39:11 发布
网友
如果我
from file import variable
并且模块文件中的varable被更改,variable的值不会被更新。 如果我
varable
variable
变量file.variable已更新。在
file.variable
有没有一种方法可以有选择地从模块中导入变量,将它们放在modules本地范围内并反映更新。在
不,在Python中,所有变量都是对象的引用(指针)。简单的赋值在中重新绑定被分配的名称会将它们指向不同的对象。也就是说,如果你有两个名字,a和{},它们指向同一个对象,比如42,然后将{}分配给另一个对象,比如"Don't Panic",a仍然指向{}。在
a
42
"Don't Panic"
a = b = 42 b = "Don't Panic" print a
不管涉及的名称是在同一个模块中还是在不同的模块中,这一点都是正确的。在
如果不希望出现这种情况,请不要为同一对象使用其他名称。正如您所发现的,您应该import file并以file.variable而不是from file import variable来访问它。后者相当于:
import file
所以,在幕后,from ... import正在分配一个新的名称。名称与它已有的名称相同,但它在不同的范围内,是对对象的新引用。在
from ... import
另一个可能的解决方案是使用可变对象,这样就不需要进行简单的赋值。例如,如果a是一个列表,那么您可以随意修改a[0]和{}等等,而不必更改a指向的内容。您甚至可以重新分配对象的整个内容,而不必重新绑定名称:a[:] = [1, 2, 3]。由于更改的是对象本身,而不是任何名称所指向的对象,因此可以通过任何名称看到更改。在
a[0]
a[:] = [1, 2, 3]
不,在Python中,所有变量都是对象的引用(指针)。简单的赋值在中重新绑定被分配的名称会将它们指向不同的对象。也就是说,如果你有两个名字,},它们指向同一个对象,比如}分配给另一个对象,比如}。在
a
和{42
,然后将{"Don't Panic"
,a
仍然指向{不管涉及的名称是在同一个模块中还是在不同的模块中,这一点都是正确的。在
如果不希望出现这种情况,请不要为同一对象使用其他名称。正如您所发现的,您应该
^{pr2}$import file
并以file.variable
而不是from file import variable
来访问它。后者相当于:所以,在幕后,
from ... import
正在分配一个新的名称。名称与它已有的名称相同,但它在不同的范围内,是对对象的新引用。在另一个可能的解决方案是使用可变对象,这样就不需要进行简单的赋值。例如,如果}等等,而不必更改
a
是一个列表,那么您可以随意修改a[0]
和{a
指向的内容。您甚至可以重新分配对象的整个内容,而不必重新绑定名称:a[:] = [1, 2, 3]
。由于更改的是对象本身,而不是任何名称所指向的对象,因此可以通过任何名称看到更改。在相关问题 更多 >
编程相关推荐