一、局部作用域(Local)
1)作用域:又称为作用范围,即在什么范围内有效。变量的查找规则,依次按照作用域的优先顺序分别为【L-E-G-B】,先从局部作用域找,再去内建作用域找。
2)局部作用域:函数内空间。只能在函数内使用,该范围内的变量临时存活,只有在函数调用时生成,调用结束后释放。
二、嵌套函数外层非全局作用域【闭包外】(Enclosing)
嵌套函数外层非全局作用域:嵌套函数中外层函数内空间。该范围内变量,可以被内层和外层函数共享。
def outer(): a = 4 # 嵌套函数外层非全局作用域【闭包外变量】 def inner(b): nonlocal a # 声明的变量不是局部变量 b = 30 # a += b print(a+b) return inner # 需要将内部函数返回 f = outer() f(30) >>34
三、全局作用域(Global)
全局作用域:程序内空间。该范围内变量,可以被程序中所有函数共享。
四、内建作用域(Built-in)
内建作用域:内置空间。该范围内变量,在任意位置均可使用。
五、全局变量与局部变量
根据作用域的不同,变量可分为全局变量和局部变量。全局变量:编写于整个程序内的变量;局部变量:编写于整个函数内的变量。
# 虽然变量名一样,但是作用域范围不同,互相不受影响 lemon = 5 # 全局变量 def fruit(): lemon = 20 # 局部变量 print(lemon) fruit() print(lemon) >>20 >>5
# 函数内部可以引用全局变量
lemon = 5 # 全局变量 def fruit(): print(lemon) fruit() >>5
# 函数外部一般不可引用函数内部的局部变量 # lemon = 5 # 全局变量 def fruit(): lemon = 20 # 局部变量 print(lemon) print(lemon) >>NameError: name 'lemon' is not defined
六、作用域链
作用域具有链式查找特性。函数内部引用变量,会优先引用最近局部变量;若内部无所需变量,会逐级向上寻找(引用全局变量);函数外部,一般不可引用局部变量。
lemon = 3 pear = 10 def fruit(): lemon = 5 print(lemon) print(pear) # 内部无所需变量,会逐级向上寻找(引用全局变量) fruit() print(lemon) # 函数外部,一般不可引用局部变量 >>5 >>10 >>3
七、作用域中的关键字用法
1)global关键字,可在函数内部声明多个局部变量为全局变量。
lemon = 5 def fruit(): global lemon, pear # 申明“lemon,pear”为全局变量 lemon = 20 # 使用global关键字重新给lemon=5赋值 pear = 10 print(lemon) fruit() # 在需要使用函数内部的局部变量时,需要先调用函数 # lemon=6 print(lemon, pear) # 优先引用被global申明的局部变量,与代码放置位置影响不到 >>20 >>6 10
2)return关键字,程序运行第一个return语句后,大多会跳出该函数,不再执行之后代码。
def add(a, b, c, d, e): summ = a + b + c + d + e print(summ) return summ print("hello,lemon") #该代码不执行 add(1, 2, 3, 4, 5) >>15
# 函数内,可以存在多个return,一般与if条件搭配 def test1(x, y): if x > y: return x elif x < y: return y else: return x + y print(test1(4, 4)) >>8
八、闭包
闭包:函数内部再定义函数;内部函数引用了外部变量但非全局变量;需要把内部函数返回。
def outer(): a=0 def inner(b): nonlocal a a+=b # print(a+b) return inner f=outer() f(30) value=f.__closure__[0].cell_contents print(value) >>30