局部变量
局部变量指的是一个变量只能在其作用域内起到作用,当区域内的代码执行完毕后,这个变量就会销毁。
例如:
a = 10
def local():
a = 11
print(a)
local()
print(a)
这段代码会一次输出11,10
其中a = 10是全局变量,而函数内的a = 11为局部变量。a = 11的作用域仅限于loca()函数。
可是当我们调换一下a = 11和print语句的位置时,就会出现a未定义的错误。
例:
a = 10
def local():
print(a)
a = 11
local()
print(a)
这是会出现错误,因为在运行函数时定义了一个变量a,这使得在local()函数内变量名a代表的是一个局部变量。在变量未声明前使用变量就会导致错误。
但当我们吧全局变量a换成可变的数据类型时就不会出现错误。
a = [1,2,3]
def local():
print(a)
a.append(4)
local()
print(a)
结果是输出:[1,2,3], [1,2,3,4]
不会出现错误的原因就是a是一个列表,列表时可变的数据类型,在local()函数里对其进行修改时并不会创建新的变量。
闭包
闭包指的是延申一个变量的作用域。
例如:
def out():
a = []
def inner():
a.append(10)
print(a)
return inner
i = out()
i()
结果会输出[10]。a=[]产生了作用域的延伸,也就是闭包。
但把a换成不可变的数据时,就会报错。
def out():
a = 1
def inner():
a = a + 1
print(a)
return inner
i = out()
i()
在inner()里重新定义了a使得a变成了inner()的局部变量,在没有定义变量前使用变量就会导致错误。改进方式为在inner()里nonlocal来声明自由变量(out()里的a在inner()里别成为自由变量)。
def out():
a = 1
def inner():
nonlocal a
a = a + 1
print(a)
return inner
i = out()
i()