我在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(!)。
这背后的逻辑是什么?
答案 0 :(得分:7)
python 编译器使用global
关键字将函数范围中的名称标记为全局。
只要在函数的任何位置使用它,该名称就不再是本地名称。
请注意if
不会引入新范围,只有函数和模块会执行(类,列表,字典和集合理解是函数范围的特殊情况)。
(难以阅读和非pythonic)解决方法是使用globals()
函数:
def foo(a):
if a:
globals()['g'] = 10
else:
g = 20