4

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

这背后的逻辑是什么?

4

1 回答 1

7

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

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

请注意,if它不会引入新的作用域,只有函数和模块会(类、列表、字典和集合理解是函数作用域的特例)。

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

def foo(a):
    if a:
        globals()['g'] = 10
    else:
        g = 20
于 2013-05-12T13:37:54.703 回答