1.python作用域分4层,由内向外依次是:
- local:局部作用域(函数内部)
- nonlocal:内部嵌套作用域 (外部的嵌套函数)
- global:全局作用域(整个py文件)
- build-in:内建作用域
2.内层作用域对外层变量仅有读权限:
main函数内部对x进行运算,因此函数内部会将x视为局部变量,而x之前并未被赋值,因此会报错
x = 10
def main():
print(x) #此处报错:UnboundLocalError
x += 1 #此处报错:UnboundLocalError
print(x)
main()
3.函数内部对全局变量进行操作:
当函数内部传入可变的全局变量,可以修改其内部的数据,但进行赋值操作时并不会影响全局变量(因为对全局变量只有读权限,因此赋值相当于创建一个局部变量)
L = [1,2,3]
def func(a):
a[0] = 0 #此处会修改全局变量L中的数据
a = [4,5,6] #此处局部变量a重新赋值,不会影响L
print('a=',a,'L=',L) #a = [4,5,6],L = [0,2,3]
func(L)
print(L) # [0,2,3]
4.闭包问题
def inc():
x = 0
def inner():
nonlocal x
x += 1
print(x)
return inner
inc1 = inc() #inc1和inc2绑定内层函数inner,独立开辟两块存储空间
inc2 = inc()
inc1() #打印1
inc1() #打印2
inc1() #打印3
inc2() #打印1