在Python中跨文件设置全局变量

3
我希望在p2.py文件中设置全局变量x的值,然后在p1.py中使用该值。然而,在p1.py中,x的值没有改变。我尝试使用global关键字。
请问这段代码有什么问题:

p2.py

x=''
def set_vals():
   global x
   x='a'

p1.py

from p2 import *
set_vals()
global x 
print x

谢谢

1个回答

3
一旦您导入了from p2 import *,您将获得一个副本x,该副本是局部于p1的。这不是与p2中完全相同的x...现在它是p1中的本地变量'x',也指向与p2中的'x'相同的对象。 p2.x和p中的ximport p2后立即成为对同一实体的引用。但是,当您运行set_vals()时,它仅更改了p2模块内的x(重新指向指针)的值。 p1模块内的x仍然指向旧物。
set_vals函数及其全局x仍然是p2模块的一部分,即使它们已被导入到p1中。因此,它们只会影响p2中的x的值。这是因为函数记住它们创建的作用域(阅读有关闭包的内容以了解更多信息)。
您可以尝试这个,它将做我们期望的事情...
import p2
print p2.x
p2.set_vals()
print p2.x  # p2.x will change

你的代码相当于...

import p2
x = p2.x
set_vals = p2.set_vals
del p2

set_vals()   # changes p2.x
global x
print x     # this and p2.x are not same anymore

很明显,p1中的x是一个单独的变量,最初指向与p2中的“x”相同的对象。改变p2.x指针不会改变p1中的x指向的内容。 p1中的x仍然指向最初的那个。


我认为最好只使用依赖注入。通常情况下,全局变量会使得在文件之间一致共享状态变得困难。 - information_interchange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接