下面是一个带有嵌套函数的函数。请帮助我理解为什么在调用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
之外的命名空间。这就是foo
中x
的值不变的原因。如果要从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