操作变量时UnboundLocalError会产生不一致的行为

Rya*_*uck 2 python scope

在Python中,以下代码有效:

a = 1
b = 2

def test():
    print a, b

test()
Run Code Online (Sandbox Code Playgroud)

以下代码有效:

a = 1
b = 2

def test():
    if a == 1:
        b = 3
    print a, b

test()
Run Code Online (Sandbox Code Playgroud)

但是,下列情况工作:

a = 1
b = 2

def test():
    if a == 1:
        a = 3
    print a, b

test()
Run Code Online (Sandbox Code Playgroud)

最后一个块的结果是一条UnboundLocalError消息,说a在分配之前被引用.

我知道我可以做的最后一块工作如果我添加global atest()定义,所以它知道哪些a我在说什么.

为什么在分配新值时不会出错b

我是否创建了一个局部b变量,它并没有对我大喊大叫,因为我不是在分配之前尝试引用它?

但如果是这种情况,为什么我可以print a, b在第一个区块的情况下,而不必global a, b事先声明?

Bha*_*Rao 6

让我给你链接到明确提到它的文档.

如果在函数体内的任何位置为变量分配了一个新值,则假定它是一个局部变量.

(强调我的)

因此,您的变量a是局部变量而不是全局变量.这是因为你有一个任务声明,

a = 3
Run Code Online (Sandbox Code Playgroud)

在代码的第三行.这使得a局部变量.并且在声明之前引用局部变量会导致错误UnboundLocalError.

但是,在第二个代码块中,您不会生成任何此类赋值语句,因此您不会收到任何此类错误.

另一个使用ful链接就是这个

引用函数或方法中的局部变量时引发,但没有值绑定到该变量.

因此,您指的是您在下一行中创建的局部变量.

为了防止这种情况,有两种方法

  • 好方法 - 传递参数

    将您的函数定义为def test(a):并将其命名为test(a)

  • 糟糕的方式 - 使用 global

    global a在函数调用的顶部有一行.

Python范围规则有点棘手!你需要掌握它们来掌握语言.看看这个