为什么只有一些函数使用在函数外部声明的变量?

时间:2013-10-08 15:17:03

标签: python function global-variables

我有这段代码:

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

5 个答案:

答案 0 :(得分:4)

这是因为r 重新分配全局变量i。另一方面,f只是使用它。请注意,i += 1i = 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