Python:嵌套函数命名冲突

时间:2018-10-05 16:34:08

标签: python-3.x

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

rbind

我天真地希望它显示“ Global”,因为对foo()的调用发生在func()范围内的重新定义之前。但是,该行会引发此错误:

def foo():
    print("Global")

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

func()

似乎解释器基于将来的命名冲突以不同的方式处理对foo()的调用,这归因于此,因为它在函数内,因为对foo()的调用内联并且重新定义没有具有相同的行为。

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

答案::解释程序在执行函数调用之前,首先根据其用途确定函数中的每个变量是局部变量还是全局变量。在func()中定义foo()的行为使它成为本地的,因此对其的调用中断了。对于这个简单的示例也是如此:

UnboundLocalError: local variable 'foo' referenced before assignment

1 个答案:

答案 0 :(得分:2)

这是因为Python编译器在确定哪些变量在编译时而非运行时是本地变量时会查看代码块中的所有l值,因此{{1}中定义了foo }}可以使func在该代码块本地。在foo中定义它之前,您无法引用它。