我正在尝试使用diff方法练习与设置全局变量相关的概念,但以下示例并不符合我的理解。
#Scope.py
import os
x = 'mod'
def f1() :
global x
x = 'in f1'
def f2() :
import scope
scope.x = 'in f2'
def print_x() :
print x
def f3() :
import sys
sc = sys.modules['scope']
sc.x = 'in f3'
if __name__ == "__main__" :
f1()
print_x()
f2()
print_x()
f3()
print_x()
它给出了以下结果
in f1
in f1
in f1
虽然根据我的理解,它导致了
in f1
in f2
in f3
有人可以帮我理解我做错了什么吗?
答案 0 :(得分:1)
查看这段修改过的代码。
x = 'mod'
def f1():
global x
x = 'in f1'
def f2():
import scope
scope.x = 'in f2'
return scope
def print_x():
print(x)
def f3():
import sys
sc = sys.modules['__main__']
sc.x = 'in f3'
return sc
if __name__ == "__main__":
f1()
print_x()
sc = f2()
print_x()
print(sc.x)
sc = f3()
print_x()
print(sc.x)
问题在于,在原始f2()
中,您实际导入名称为scope
的{{1}}模块并修改其变量。在scope
之后,您引用print_x()
中未更改的x
。在__main__
中,您使用错误的名称引用模块:要修改它,您应该在此使用f3()
。使用__main__
,您实际上引用了scope
中导入的模块(尝试删除f2()
来电)...这显然不是您想要的。