Python3-2020-测试开发-16- 嵌套函数(内部函数 )&nonlacal声明外部函数的局部变量&LEGB规则

一、嵌套函数(内部函数 )

作用:1.封装-数据隐藏,外部无法访问“嵌套函数”;2.避免重复代码使用3.闭包

def printName(isChinese,name,familyName):

    def inner(a,b):

        print("{0}{1}".format(a,b))

    if isChinese:

        inner(name,familyName)

    else:
        inner(familyName,name)


printName(True,"","")
printName(False,"lusy","tony")

输出:

褚六
tonylusy

二、nonlacal声明外部函数的局部变量

2.1 不可修改外部函数的局部变量

def outer01():

    b = 10

    def inner():

        print("inner ",b)
        b = 20             # local variable 'b' referenced before assignment
    inner()

outer01()

输出:

local variable 'b' referenced before assignment

2.2 使用nonlacal,可修改变量

def outer02():

    b = 10

    def inner():


        nonlocal b       # nonlacal声明外部函数的局部变量
        print("inner ",b)
        b = 20              
    inner()

outer02()

三、LEGB规则

"""
Python在查找“名称”时,是按照LEGB规则查找的
Local ---> Enclosed ---> Global ---> Built in
Local 指的是函数或者类的方法内部
Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包)
Global 指的是模块中的全局变量
Built in 指的是Python为知己保留的特殊名称

如果某个name映射在局部(local)命名空间中咩有找到,接下来会在闭包作用域(enclosed)进行搜索
如果闭包作用域也没有找到,Python就会到全局(Global)命名空间中进行查找,最后会在内建(built in )命名空间查找
如果一个名称在所有命名空间中都没有找到,就会产生一个NameError
"""

3.1 Local
def legb_outer01():

    str = "b"
    def inner():
        str = "a"
        print(str)     # a

    inner()

legb_outer01()

3.2 Enclosed

def legb_outer02():

    str = "b"
    def inner():
        # str = "a"
        print(str)     # b

    inner()

legb_outer02()

3.3 Global

str = "c"
def legb_outer03():

    # str = "b"
    def inner():
        # str = "a"
        print(str)     # c

    inner()

legb_outer03()

3.4 Built in

# str = "c"
def legb_outer04():

    # str = "b"
    def inner():
        # str = "a"
        print(str)     # <class 'str'>

    inner()

legb_outer04()
原文地址:https://www.cnblogs.com/chushujin/p/13055987.html