Python中nonlocal和global的区别及闭包使用

 更新时间:2025年12月30日 09:38:19   作者:达宁214  
本文主要介绍了Python中nonlocal和global的区别及闭包使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、nonlocal和global的区别

作用范围

  • global:用于在函数内部声明一个变量是全局变量。如果在函数中使用 global 关键字声明了某个变量,那么在函数内部对该变量的操作,就是对全局作用域中这个变量的操作。例如:
count = 10
def modify_count():
    global count
    count = 20
    print(count)

modify_count()  # 输出 20
print(count)    # 输出 20,全局变量count已经被修改
  • nonlocal:用于在嵌套函数中,声明一个变量不是当前函数的局部变量,而是来自外层(非全局)函数的变量。它使得内层函数可以修改外层函数中定义的变量,前提是外层函数中没有使用 global 声明这个变量。比如:
def outer():
    num = 5
    def inner():
        nonlocal num
        num = 10
        print(num)
    inner()
    print(num)

outer()  
# 输出 10
# 输出 10,因为内层函数通过nonlocal修改了外层函数的num变量

适用场景

  • global:当需要在函数内部修改全局作用域中的变量时使用。
  • nonlocal:在函数嵌套的场景下,内层函数想要修改外层函数中定义的变量,且该变量不是全局变量时使用。

二、闭包的作用

数据隐藏与封装

闭包可以将一些数据(即外层函数的变量)与操作这些数据的函数绑定在一起,形成一个相对独立的单元,外界不能直接访问这些被 “隐藏” 的数据,只能通过闭包返回的函数来操作。例如,实现一个简单的计数器:

def counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment

count_func = counter()
print(count_func())  # 输出 1
print(count_func())  # 输出 2
print(count_func())  # 输出 3

在这个例子中,count 变量被隐藏在闭包内部,外界无法直接访问和修改,只能通过 increment 函数来对其进行递增操作,实现了数据的封装。

状态保持

闭包可以 “记住” 外层函数执行时的变量状态,方便在多次调用返回的函数时,基于之前的状态进行操作。比如模拟一个累加器:

def accumulator(initial_value=0):
    def accumulate(num):
        nonlocal initial_value
        initial_value += num
        return initial_value
    return accumulate

acc = accumulator(5)
print(acc(3))  # 输出 8,初始值5加上传入的3
print(acc(2))  # 输出 10,基于上一次结果8再加上传入的2

这里闭包记住了 initial_value 的状态,每次调用 accumulate 函数时,都是基于上一次的状态进行累加操作。

函数复用

闭包可以创建具有特定初始状态的函数,方便在不同场景下复用。比如创建不同税率的计算函数:

def tax_calculator(tax_rate):
    def calculate_tax(amount):
        return amount * tax_rate
    return calculate_tax

calculate_sales_tax = tax_calculator(0.08)  # 8% 的销售税
calculate_income_tax = tax_calculator(0.2)  # 20% 的所得税
print(calculate_sales_tax(100))  # 输出 8
print(calculate_income_tax(1000))  # 输出 200

通过 tax_calculator 函数创建不同税率的计算函数,这些函数都能复用内部计算逻辑,只是初始的税率不同。

三、注意

在 Python 中,内部函数本来就可以 “读取” 外层函数的变量(包括参数),但只有通过 nonlocal 声明后,才能 “修改” 外层函数的变量

到此这篇关于Python中nonlocal和global的区别及闭包使用的文章就介绍到这了,更多相关Python nonlocal和global内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python使用正则表达式(Regular Expression)方法超详细

    python使用正则表达式(Regular Expression)方法超详细

    这篇文章主要介绍了python使用正则表达式(Regular Expression)方法超详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Python创建字典的八种方式

    Python创建字典的八种方式

    今天小编就为大家分享一篇关于Python创建字典的八种方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Python自定义线程类简单示例

    Python自定义线程类简单示例

    这篇文章主要介绍了Python自定义线程类,结合简单实例形式分析Python线程的定义与调用相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • Python实现的旋转数组功能算法示例

    Python实现的旋转数组功能算法示例

    这篇文章主要介绍了Python实现的旋转数组功能算法,结合实例形式总结分析了数组旋转算法的原理与实现技巧,需要的朋友可以参考下
    2019-02-02
  • Python OpenCV高斯金字塔与拉普拉斯金字塔的实现

    Python OpenCV高斯金字塔与拉普拉斯金字塔的实现

    这篇文章主要介绍了Python OpenCV高斯金字塔与拉普拉斯金字塔的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • python高级之元类的用法总结

    python高级之元类的用法总结

    元类是Python中最高级别的编程概念之一,用于创建类的类,虽然元类在日常Python编程中并不常见,但它们提供了无限的可能性来改变类的行为,从而使元编程成为可能,这篇文章主要给大家介绍了关于python高级之元类的相关资料,需要的朋友可以参考下
    2024-08-08
  • Python函数中的可变长参数详解

    Python函数中的可变长参数详解

    在本篇文章里小编给大家整理的是关于Python函数中的可变长参数的相关知识点内容,有需要的朋友们参考下。
    2019-09-09
  • 基于python神经卷积网络的人脸识别

    基于python神经卷积网络的人脸识别

    这篇文章主要为大家详细介绍了基于python神经卷积网络的人脸识别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Python openpyxl模块学习之轻松玩转Excel

    Python openpyxl模块学习之轻松玩转Excel

    Python提供了许多操作Excel的模块,能够让我们从繁琐的工作中腾出双手。本文主要为大家介绍的是openpyxl模块,它的功能相对与其他模块更为齐全,感兴趣的小伙伴快来学习一下吧
    2021-12-12
  • 在Django下创建项目以及设置settings.py教程

    在Django下创建项目以及设置settings.py教程

    今天小编就为大家分享一篇在Django下创建项目以及设置settings.py教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12

最新评论