Python 局部函数详解 [Python Function][局部函数作用域][扩大局部函数作用域][“遮蔽”问题及其解决办法]

您的“关注”和“点赞”,是信任,是认可,是支持,是动力…

如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。

1 Python 局部函数概述

在 Python 函数的内部定义的函数,称为局部函数。

举例如下所示:

# 全局函数 person()
def person():
    # 局部函数 men()
    def men():
        print('局部函数 men()')

    # 局部函数 women()
    def women():
        print('局部函数 women()')

2 局部函数的作用域

2.1 局部函数作用域概述

局部函数默认只能在其所在函数的作用域内使用。

举例如下所示:

# 全局函数 person()
def person():
    # 局部函数 men()
    def men():
        print('局部函数 men()')

    # 局部函数 women()
    def women():
        print('局部函数 women()')

    men()  # 在所在函数 person() 的作用域内调用局部函数 men()
    women()  # 在所在函数 person() 的作用域内调用局部函数 women()


person()  # 调用全局函数 person()
men()  # 局部函数默认只能在其所在函数的作用域内使用,否则会报错

运行结果:

局部函数 men()
局部函数 women()
Traceback (most recent call last):
  File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 16, in <module>
    men()  # 局部函数默认只能在其所在函数的作用域内使用,否则会报错
NameError: name 'men' is not defined

2.2 扩大局部函数的作用域

将局部函数作为所在函数的返回值,可以扩大局部函数的使用范围,既可以在所在函数内部使用,也可以在所在函数的作用域中使用。

举例如下所示:

# 全局函数 person()
def person():
    # 局部函数 men()
    def men():
        print('局部函数 men()')

    # 局部函数 women()
    def women():
        print('局部函数 women()')

    return men  # 将局部函数 men() 作为所在函数 person() 的返回值


new_men = person()  # 调用全局函数 person()
new_men()  # 调用局部函数 men()

运行结果:

局部函数 men()

3 “遮蔽”问题及其解决办法

3.1 “遮蔽”问题描述

局部函数和所在函数中有变量同名,就会发生“遮蔽”问题。

举例如下所示:

例一,

# 全局函数 person()
def person():
    name = '码农阿杰'
    # 局部函数 men()
    def men():
        name = '阿杰'  # 覆盖所在函数中的同名变量(“就近原则”)
        print(name)
    men()


person()  # 调用全局函数 person()

运行结果:

阿杰

例二,

# 全局函数 person()
def person():
    name = '码农阿杰'
    # 局部函数 men()
    def men():
        print(name)  # 试图调用所在函数中的 name 变量,会发生“遮蔽”问题,报 UnboundLocalError 错误
        name = '阿杰'

    men()


person()  # 调用全局函数 person()

运行结果:

    print(name)  # 试图调用所在函数中的 name 变量
UnboundLocalError: local variable 'name' referenced before assignment
错误提示信息直译:
local variable 'name' referenced before assignment  
局部变量 name 还没定义就使用

3.2 “遮蔽”问题解决办法

使用 nonlocal 关键字修饰局部函数中的同名变量,可以解决“遮蔽”问题。

举例如下所示:

# 全局函数 person()
def person():
    name = '码农阿杰'
    # 局部函数 men()
    def men():
        nonlocal name  # 使用 nonlocal 关键字修饰,避免“遮蔽”
        print(name)  # 试图调用所在函数中的 name 变量
        name = '阿杰'

    men()


person()  # 调用全局函数 person()

运行结果:

码农阿杰

【友情链接】

微信公众号:码农阿杰

博客园

【参考资料】

Python 官网

Python 3.8.2 documentation

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章