Python:嵌套函数命名冲突



我最近遇到了以下python代码的错误:

def foo():
print("Global")
def func():
foo() # This causes an error, but only if foo() is redefined
def foo():
print("Nested")
func()

我天真地期望这会打印"全局",因为对 foo(( 的调用发生在它在 func(( 范围内重新定义之前。但是,该行会引发此错误:

UnboundLocalError: local variable 'foo' referenced before assignment

似乎解释器根据未来的命名冲突以不同的方式对待对 foo(( 的调用,并且它必须归因于这在一个函数中,因为内联对 foo(( 的调用和重新定义没有相同的行为。

问:在这种情况下,幕后发生了什么?我找到了其他几个关于局部变量与全局变量的问题/答案,但没有关于这样的局部函数。谢谢!

答:解释器首先根据函数中的每个变量的使用来确定函数中的每个变量是局部变量还是全局变量,然后再执行函数调用。在 func(( 中定义 foo(( 的行为使其成为本地的,因此对它的调用中断。对于这个更简单的例子也是如此:

x = 9
def func():
print(x)
x=5 # This statement makes 'x' local, so the previous line throws
func()

这是因为 Python 编译器在确定哪些变量在编译时而不是运行时是局部变量时会查看代码块中的所有 l 值,因此foo在任何地方func中定义的事实使得该代码块的本地foo。在func中定义它之前,您不能引用它。

最新更新