为什么 Python 中内部函数无法获取外部作用域中的变量

4
def foo():
    m = 3
    def bar():
        print(m) # code 1
        m=4 # code 2
    bar()
foo()

UnboundLocalError: 在赋值之前,局部变量 'm' 被引用

为什么会出现 UnboundLocalError?我知道 bar 不能改变 m 的值,但是它难道不应该只能获取 m 的值吗?

而且当我分别尝试代码 1/code 2 时,它们都可以正常工作。


2
你的缩进不正确,请先修正! - ᴀʀᴍᴀɴ
5
如果一个函数包含对变量的赋值,并且没有 global 或者 nonlocal 声明,那么这个变量是局部变量——即使在赋值之前的函数内部也是如此。 - jasonharper
@ᴀʀᴍᴀɴ 谢谢!格式真的很重要。 - Liu Charles
@jasonharper 谢谢,我大概明白了。这真的很有帮助。 - Liu Charles
1个回答

3
自从内部函数bar有一个赋值m=4,整个函数中的m都被视为局部变量。但是在你调用print(m)时,m还没有被创建。因此,你会得到错误UnboundLocalError: local variable 'm' referenced before assignment

在Python 3中,你可以通过在内部作用域中声明mnonlocal来修复代码。这避免了将m放置在全局范围内(这也是在Python 2和3中使用global关键字代替nonlocal的选项)。以下代码适用于Python 3:

def foo():
    m = 3
    def bar():
        nonlocal m
        print(m) # code 1
        m=4 # code 2
    bar()
foo()

那么编译器会查看整个函数bar并知道有一个本地变量m,但Python不是逐行执行的吗?我猜测py->pyc的过程做到了这一点(查看整个函数bar),然后机器逐行执行pyc。(我在网上搜索)抱歉,我是新手,谢谢! - Liu Charles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接