【发布时间】:2013-05-12 13:37:23
【问题描述】:
我在 python 中搞乱了范围,发现了一些我认为很奇怪的东西:
g = 5
def foo(a):
if a:
global g
g = 10
else:
g = 20
print("global g: ",g)
foo(False)
print("global g: ",g) # 20?! What?
foo(True)
print("global g: ",g)
我认为第二次打印应该是“5”,因为全局语句从未执行过,但很明显,输出是 20(!)。
这背后的逻辑是什么?
【问题讨论】:
-
如果您有兴趣玩转这些东西,您应该学习字节码的基础知识并玩转
dis模块。 (在顶层使用global定义foo后尝试dis.dis(foo),在if内部,根本不存在。) -
我实际上确实使用了 dis 模块,所以我看到 g = 20 被放入了全局范围。因此,我怀疑给定的答案,但想确定:)
标签: python programming-languages scope lexical-scope