这个python全球范围魔术背后的逻辑是什么?

时间:2013-05-12 13:37:23

标签: python programming-languages scope lexical-scope

我在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(!)。

这背后的逻辑是什么?

1 个答案:

答案 0 :(得分:7)

python 编译器使用global关键字将函数范围中的名称标记为全局。

只要在函数的任何位置使用它,该名称就不再是本地名称。

请注意if不会引入新范围,只有函数和模块会执行(类,列表,字典和集合理解是函数范围的特殊情况)。

(难以阅读和非pythonic)解决方法是使用globals()函数:

def foo(a):
    if a:
        globals()['g'] = 10
    else:
        g = 20