一、局部作用域(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