我只是遇到了困惑,让我们考虑以下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无法访问它?
答案 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"