Python嵌套函数中的全局关键字



下面是一个带有嵌套函数的函数。请帮助我理解为什么在调用bar((之前和之后"x"的值是相同的。当我们调用主函数时,为什么x=25。

def foo():
x = 20
def bar():
global x
x = 25
print("Before calling bar: ", x)
print("Calling bar now")
bar()
print("After calling bar: ", x)
foo()
print("x in main: ", x)

这是我们得到的输出:

Before calling bar: 20
Calling bar now
After calling bar: 20
x in main: 25

代码不应该在调用bar((后输出x=25吗?因为它有x作为全局变量?

global用于访问本地上下文之外的全局命名空间,因此在您的示例中,您可以访问foo之外的命名空间。这就是foox的值不变的原因。如果要从bar访问foo内部的值,则必须使用nonlocal。当您尝试在脚本的最后一行打印x时,这将导致NameError,因为x不再在全局命名空间中定义:

def foo():
x = 20
def bar():
nonlocal x
x = 25
print("Before calling bar: ", x)
print("Calling bar now")
bar()
print("After calling bar: ", x)
foo()
print("x in main: ", x)  # Raises NameError because x is not defined in global namespace

最新更新