python中的变量范围

时间:2014-03-04 09:28:37

标签: python

我只是遇到了困惑,让我们考虑以下2个代码

第一个代码:

def out():        #func1
    print i
i=5

Output:5

第二

def inc():        #func2
        i=i+1
        print i
i=5

当执行上述程序时,func1不会给出任何错误,但func2会给出错误...

error: var i referenced before assignment

我很困惑我是一个局部变量或全局。如果它是局部变量,那么func1如何访问它,如果它是全局的,那么为什么func2无法访问它?

2 个答案:

答案 0 :(得分:4)

这取决于,当您使用=运算符在函数内部分配变量时,它将 shadow 变量的任何其他外部作用域声明并使用local,除非它已声明{ {1}}在函数内部。

例如,如果您这样做,您的第二次尝试将按预期工作:

global

另一方面,如果在函数内部没有执行赋值,它将使用外部作用域声明,正如您在第一次尝试中看到的那样。

此外,如果您使用def inc(): #func2 global i i=i+1 print i i=5 但外部作用域中未定义global i,则该函数也会引发未定义的异常。

答案 1 :(得分:1)

您需要在func2中将i声明为global才能修改其值。

def func_2():
    global i
    i=i+1
    print i

如果没有global语句,您可以将变量本地增加到func_2,而不是先实际给它一个值。这就是你的错误所在。

您可以打印全局变量的内容,而无需将其声明为全局变量。你也可以在没有全局语句的情况下访问列表和字典之类的可变容器,但是如果不先将它们全局化,就不能修改字符串,整数,浮点数等。

示例:

>>> i = [1, 2, 3]
>>> def func_3():
...    i.append(4)
...    print i
>>> func_3()
[1, 2, 3, 4]

>>> i = "foo"
>>> def func_4()
...    i = "bar"
...    print i
>>> func_4()
"bar"
>>> print i
"foo"