为什么我在赋值错误之前得到一个引用的局部变量?

时间:2016-06-06 07:26:17

标签: python

答案应该是2,因为首先调用main()函数,然后调用first()函数,覆盖在任何函数之外定义的全局变量num = 0,因此将其变为具有全局范围的变量。然而,我收到以下错误:

UnboundLocalError: local variable 'num' referenced before assignment  

为什么我收到此错误?

def first():
    num = num + 1

def main():
    num = 1
    first()
    print(num)

num = 0

num_result = main()

print(num_result) 

5 个答案:

答案 0 :(得分:9)

OP写道(强调我的):

  

答案应为2,因为首先调用main()函数,然后调用first()函数,覆盖全局变量

它不会覆盖全局变量。除非您将变量明确指定为全局变量,否则如果函数中的变量有任何赋值,则假定它是本地变量。另见python tutorial on defining functions所述的地方(强调我的):

  

更确切地说,函数中的所有变量赋值都将值存储在本地符号表中;而变量引用首先在本地符号表中查找,然后在封闭函数的本地符号表中查找,然后在全局符号表中查找,最后在内置名称表中查找。因此,全局变量不能直接在函数中赋值(除非在全局语句中命名),尽管它们可能被引用。

documentation of the global statement(如果有人使用Python 3正在考虑这一点,请同时查看(与global相比)非常有用的nonlocal statement及其PEP 3104 })。

“修复”您的代码:

def first():
    global num
    num = num + 1

def main():
    global num
    num = 1
    first()
    print(num)

num = 0

num_result = main()

print(num_result) 

请不要以这种方式使用全局变量。 @LutzHorn has shown in his answer how to do it right

避免全局变量的原因是它们的效果很难测试,一旦代码变得足够复杂,很难推理。如果每个函数修改全局变量而不是正确地获取参数和返回值,那么只要一个函数与它的距离超过一周左右,理解代码实际执行的操作就很难。

答案 1 :(得分:6)

first内,num未知。使用参数和return语句。

def first(num):
    return num + 1

def main():
    num = 1
    num = first(num)
    return num

num = 0

num_result = main()

print(num_result)

答案 2 :(得分:0)

这是范围错误。首先,在尝试添加一个之前没有num。如果在一个bloc中声明了一个变量,你可以在一个bloc中调用一个变量,如果它被声明为全局变量。

要传递变量,可以使用函数的参数:

datatable(
        iris2,
        callback=JS('$("a.buttons-copy").css("background","red"); 
                    $("a.buttons-print").css("background","green"); 
                    return table;'),
        extensions = 'Buttons', options = list(
                dom = 'Bfrtip',
                buttons = c('copy', 'print')
        )
)

答案 3 :(得分:0)

“num”未在函数“first”中定义。它不是一个全局变量,它超出了“第一”的范围。要使其全局化,只需编辑您的函数:

def first():
    global num
    num = num + 1

在我看来,使用全局变量是不好的做法。您可以通过使用参数和返回来实现相同的目的:

def first(num):
    return num + 1

def main(num):
    num = 1
    num = first(num)
    print(num)
    return num

num = 0

num_result = main(num)

print(num_result) 

答案 4 :(得分:0)

变量num刚刚在main方法中初始化,你没有在first() - Method中初始化它。所以你要把它交给第一个() - 方法。

def first(num):
    return num + 1

def main():
    num = 1
    num = first(num)
    return num

num = 0

num_result = main()

print(num_result)