Python 全局关键字奇怪的行为

Python global keyword weird behaviour

def a():
    g=1
    def b():
        global g
        g=2
        def c():
            global g
            g=3
        c()
        print("c", g) #3
    b()
    print("b", g) #1 
a()
print("a", g) #3

输出为

c 3
b 1
a 3

我不明白为什么 g 的值在 a() 里面是 1 而在 a()

外面是 3

如果 g 的值在两个地方是 3:

  1. 调用后 c()
  2. a()之外。

为什么1a()里面?

当您在 a() 中执行 g=1 时,它会为该函数创建一个新的 local 变量。当您在 b()c() 中执行 global g 时,它会使 g 引用全局变量(当 运行 b 时还不存在) ).所以 cb 和全局作用域都指代同一个 g(即 运行 c 之后的 3),而 a 指的是它的本地 g 从未改变并且仍然是 1.

global 更改为 nonlocal 将使 cb 都打印为打印 3,但现在将为最后一个打印 NameError打印,因为全局范围内没有 g

或者,将 global g 添加到 a 的开头,将使所有三个打印件都打印 3.