我有这段代码:
def r():
i += 1
return i
def f():
return x*a
i = 0
a=2
x=3
print f()
print r()
我的r()
收到此错误,但f()
~$ python ~/dev/python/inf1100/test.py
6
Traceback (most recent call last):
File "/home/marius/dev/python/inf1100/test.py", line 18, in <module>
print r()
File "/home/marius/dev/python/inf1100/test.py", line 2, in r
i += 1
UnboundLocalError: local variable 'i' referenced before assignment
为什么f()
可以使用在函数外部定义的变量,而r()
则不能?
答案 0 :(得分:4)
这是因为r
重新分配全局变量i
。另一方面,f
只是使用它。请注意,i += 1
与i = i + 1
相同。
除非您明确说明,否则Python会将函数中使用的所有变量视为本地变量。此外,由于在i
的本地范围内没有定义变量r
,因此会抛出错误。
如果要在函数中重新分配全局变量,则必须输入:
global var
在函数顶部明确声明var
是全局的。
因此,为了使r
有效,应将其重写为:
def r():
global i
i += 1
return i
答案 1 :(得分:3)
这篇文章:
def r():
i += 1
return i
不仅使用全局变量,还尝试修改它们(或更准确地说:为全局变量i
分配不同的值)。
为了使其有效,您可以将此变量声明为全局:
def r():
global i
i += 1
return i
答案 2 :(得分:3)
我想在大多数时候指出这一点:
x = 1
def f():
global x
x += 1
f()
是不好的做法,你想要改用参数:
x = 1
def f(a_number):
return a_number + 1
x = f(x)
另外,这里:
def r():
global i
i += 1
return i
return i
是多余的,通过调用函数来增加变量。
此问题的this部分也是相关且有用的。
答案 3 :(得分:1)
在r
中,您正在影响全局i
。由于在尝试添加之前未分配,因此会出现错误。
一种可能的解决方案是在global i
函数中使用r
,如此
def r():
global i
i += 1
return i
答案 4 :(得分:0)
如果你赋值给变量,python会考虑变量local而不会费心寻找同名的全局变量。按照其他答案中的建议使用global
。