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
:
- 调用后
c()
- 在
a()
之外。
为什么1
在a()
里面?
当您在 a()
中执行 g=1
时,它会为该函数创建一个新的 local 变量。当您在 b()
和 c()
中执行 global g
时,它会使 g
引用全局变量(当 运行 b
时还不存在) ).所以 c
、b
和全局作用域都指代同一个 g
(即 运行 c
之后的 3),而 a
指的是它的本地 g
从未改变并且仍然是 1.
将 global
更改为 nonlocal
将使 c
和 b
都打印为打印 3,但现在将为最后一个打印 NameError
打印,因为全局范围内没有 g
。
或者,将 global g
添加到 a
的开头,将使所有三个打印件都打印 3.
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
:
- 调用后
c()
- 在
a()
之外。
为什么1
在a()
里面?
当您在 a()
中执行 g=1
时,它会为该函数创建一个新的 local 变量。当您在 b()
和 c()
中执行 global g
时,它会使 g
引用全局变量(当 运行 b
时还不存在) ).所以 c
、b
和全局作用域都指代同一个 g
(即 运行 c
之后的 3),而 a
指的是它的本地 g
从未改变并且仍然是 1.
将 global
更改为 nonlocal
将使 c
和 b
都打印为打印 3,但现在将为最后一个打印 NameError
打印,因为全局范围内没有 g
。
或者,将 global g
添加到 a
的开头,将使所有三个打印件都打印 3.