2

我有这个代码:

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()不能?

4

5 回答 5

5

那是因为r 重新分配了全局变量if另一方面只是使用它。请记住,i += 1与 相同i = i + 1

除非您另有明确说明,否则 Python 将函数中使用的所有变量都视为本地变量。i此外,由于在 的本地范围内没有定义变量r,因此会引发错误。

如果要在函数中重新分配全局变量,则必须输入:

global var

在函数顶部显式声明var为全局。

因此,要进行r工作,应该将其重写为:

def r():
    global i
    i += 1
    return i
于 2013-10-08T15:18:14.687 回答
4

我想指出,大多数时候,这是:

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是多余的,变量是通过调用函数来增加的。

Python FAQ 的这一部分也是相关且有用的。

于 2013-10-08T15:27:18.327 回答
3

这件作品:

def r():
    i += 1
    return i

不仅使用全局变量,还尝试修改它们(或更准确地说:为全局变量分配不同的值i)。

要使其工作,您只需将此变量声明为全局变量:

def r():
    global i
    i += 1
    return i
于 2013-10-08T15:18:34.217 回答
1

r你的影子你的全球i。由于在您尝试添加之前未分配它,因此您会收到错误消息。

一个可能的解决方案是像这样global ir函数中使用

def r():
    global i
    i += 1
    return i
于 2013-10-08T15:19:47.673 回答
0

如果您分配给一个变量,python 将认为该变量是本地的,并且不会费心寻找同名的全局变量。global按照其他答案中的建议使用。

于 2013-10-08T15:21:39.323 回答