答案应该是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)
答案 0 :(得分:9)
答案应为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)