Python嵌套函数、作用域查找机制与偏函数详解

南乔
南乔
发布时间:2026-10-14| 6人浏览过
原创

本文深入解析Python中嵌套函数的定义与调用限制,详细阐述LEGB(Local-Enclosing-Global-Built-in)作用域查找规则及代码块级变量可见性。同时介绍偏函数(partial)如何通过预设参数生成新函数,优化代码复用。

本文通过具体实例,详细解析Python中嵌套函数的定义与调用方式、变量作用域的查找机制(LEGB规则),以及偏函数(partial)的应用技巧,供开发者参考学习。

内嵌函数(即嵌套函数):

  • 定义方式:在现有函数的内部再次定义一个新的函数。
  • 调用限制:若内嵌函数在父函数体内未被显式调用,则无法从外部直接访问或调用该内嵌函数。

def my_pr1():
  print("第一层打印")
  def my_pr2():
    print("第二层打印")
  my_pr2()#如果在函数体内不调用内嵌的函数,那么无法在外部调用
my_pr1()

作用域:

变量查找遵循 LEGB 规则,顺序为:local(局部作用域) --> enclosing(外层函数作用域) --> global(全局作用域) --> build-in(内建作用域)。

代码块级别的作用域特性:Python 不划分代码块(如 if、for)的独立作用域。

  • 变量可见性:定义在代码块内的变量,在代码块外部依然可以被访问和调用。

if 1>0:
  name="automan"
print(name)

上述代码运行结果:

automan

函数基本的作用域:

  • 局部作用域:
    • 在函数内部定义的变量属于局部变量,在函数外部无法直接访问。

a=50
def change(x):
  x=6
change(a)
print("after change:",a)

上述代码运行结果:

after change: 50


def func3():
  superman="automan"
print(superman)

运行结果:

NameError: name 'superman' is not defined

  • 内嵌关系的函数的作用域:
    • 对于存在内嵌关系的函数,其作用域查找依然严格遵循 LEGB 规则:local(局部作用域) --> enclosing(函数范围作用域)--> global(全局作用域)---> build-in(内建对象作用域)。
  1. 若当前函数内部存在目标变量,则优先使用当前函数内的变量值;
  2. 若当前函数内不存在,则向上层(父)函数中查找目标变量。若父函数中存在该变量,则使用父函数的变量值;【若父函数仍有父函数,查找过程会持续向上层传递】
  3. 若一直向上查找直至离开最外层函数体仍未找到,则在全局范围内搜索该变量。
  4. 若全局范围内仍未找到,则进一步在内建对象作用域中查找。
  5. 若以上所有作用域均未找到,则报错并抛出异常。

def func4():
  superman="automan"
  def haha():
    print(superman)
  haha()
func4()

运行结果:

automan

  • 非内嵌关系的函数的作用域:
    • 对于非内嵌关系的函数,其作用域查找同样遵循 LEGB 规则:local(局部作用域) --> enclosing(函数范围作用域)--> global(全局作用域)---> build-in(内建对象作用域)。
    • 但由于这些函数之间不存在父子嵌套关系,当在当前函数作用域内找不到目标变量时,会直接跳过中间层级,前往全局作用域进行查找。

aotuman='金甲战士'
def f5():
  print(aotuman)
def f4():
  aotuman='max'
  f5()
f4()

运行结果:

金甲战士

偏函数:

  • 功能:通过预设某个函数的部分参数,返回一个具有部分固定参数配置的新函数。
  • 优势:有效避免了在实际调用时重复输入相同的参数值。

import functools
print_t=functools.partial(print,end='\t')
print_t(1)
print_t(1)
print_t(1)

上述代码结果:

1 1 1

关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述的嵌套函数、作用域及偏函数知识对大家学习Python程序设计有所帮助。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。