百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

新手学Python避坑,学习效率狂飙! 二十三、Python 闭包问题

off999 2025-05-08 04:43 28 浏览 0 评论

感谢大家对《新手学Python避坑,学习效率狂飙!》系列的点赞、关注和收藏,今天这编是这个系列的第二十三个分享,前面还有二十二个,大家可以关注下之前发布的文章。下面是我们今天的分享:

闭包的定义与原理

在 Python 里,闭包指的是由函数及其相关的引用环境组合而成的实体。也就是,闭包能够让函数访问其定义时所在的外部(非全局)作用域里的变量,即便该外部函数已经执行结束,这些变量的值依旧会被保留。

闭包的形成需要满足以下条件:

  1. 存在一个嵌套函数,也就是在一个函数内部定义另一个函数。
  2. 嵌套函数要引用外部函数的变量。
  3. 外部函数返回嵌套函数。

闭包示例代码

python

def outer_function(x):
    def inner_function(y):
        return x + y  # 引用外部函数的变量 x
    return inner_function

# 创建闭包
closure = outer_function(10)

# 调用闭包
result = closure(5)
print(result)  # 输出 15

代码解释

  • outer_function 是外部函数,它接收一个参数 x。
  • inner_function 是嵌套函数,它接收一个参数 y,并且引用了外部函数的变量 x。
  • outer_function 返回了 inner_function,这样就形成了一个闭包。
  • 当调用 outer_function(10) 时,会返回一个闭包对象,该闭包对象记住了 x 的值为 10。
  • 调用 closure(5) 时,实际上是调用了 inner_function(5),由于闭包记住了 x 的值为 10,所以最终结果是 15。

重点总结

  • 数据封装与隐藏:闭包能够把数据封装在函数内部,避免全局变量的使用,从而提升代码的安全性和可维护性。
  • 状态保持:闭包可以保留外部函数的状态,即便外部函数已经执行完毕,这些状态依旧可以被访问和使用。
  • 延迟执行:闭包可以在外部函数调用之后再执行,实现延迟执行的效果。

避坑分享

1. 循环中创建闭包

在循环里创建闭包时,要留意变量的绑定问题。因为闭包引用的是变量本身,而非变量的值,所以在循环结束后,所有闭包引用的变量值都是循环结束时的值。

python

def create_functions():
    functions = []
    for i in range(3):
        def func():
            return i
        functions.append(func)
    return functions

funcs = create_functions()
for func in funcs:
    print(func())  # 输出 2 2 2

解决方法:可以通过给内部函数传递参数的方式来固定变量的值。

python

def create_functions():
    functions = []
    for i in range(3):
        def func(x=i):
            return x
        functions.append(func)
    return functions

funcs = create_functions()
for func in funcs:
    print(func())  # 输出 0 1 2

2. 内存泄漏风险

由于闭包会保留外部函数的状态,所以如果闭包一直被引用,外部函数的局部变量就不会被垃圾回收,从而可能导致内存泄漏。

解决方法:在不需要使用闭包时,及时释放对闭包的引用。

python

def outer():
    x = [1, 2, 3]
    def inner():
        return x
    return inner

closure = outer()
# 使用闭包
print(closure())  # 输出 [1, 2, 3]

# 不再使用闭包,释放引用
closure = None

通过上述内容的分享,大家可以对 Python 闭包有了一个较为清晰的认识,并且知道如何避免常见的闭包问题。

相关推荐

电脑怎么看配置信息
电脑怎么看配置信息

要查看Windows电脑的配置信息,可以通过按下Win键+R,然后在弹出的运行对话框中输入“dxdiag”并按回车键打开DirectX诊断工具,可以查看有关处理器、内存、显卡等硬件信息。另外,还可以右键点击“此电脑”,选择“属性”来查看...

2025-12-21 18:03 off999

mpeg是什么格式(mpeg是什么格式和mp4的区别)

是视频格式,是电脑视频文件的一种,相对其它视频文件格式而言,mpeg格式占的存储空间相对比较小,那么像素也就相对比较低,图像也没有其它格式那么高清,不过一般情况下已经满足正常的使用。好多视频文件都是采...

电脑参数配置怎么选(电脑参数配置怎么选择)

1、CPU,这个主要取决于频率和二级缓存,三级缓存,核心数量。频率越高、二级缓存越大,三级缓存越大,核心越多,运行速度越快。速度越快的CPU只有三级缓存影响响应速度。2、内存,内存的存取速度取决于接口...

windows7字体(Windows7字体库在哪)

win7系统默认中文字体是微软雅黑字体1、首先我们先打开个性化2、然后我们打开“窗口颜色”3、然后我们点击“项目”里的桌面,选择“已选定的项目”4、下面就可以改字体,还有字体的颜色、大小5、然后点击“...

windows7x86是32位吗(windows7 x86)

X86不是代表操作系统,是代表的CPU的类型,如果你知道CPU的发展史就知道,个人用计算机的CPU很早的版本是从286、386、486、586、奔腾等等类型发展起来的,所以X86的代表PC的CPU的类...

固态硬盘删除后又自动恢复了

进入BIOS查看,第一启动项是不是UEFI引导,改掉它可以下载个pe,下载安装在本地磁盘里,重启进入pe工具,先给固态格式化分区,在ghost机械盘上的系统,还原到固态上。遇到这种情况一定不要在此...

win10版本回退(win10回退到以前版本)

如果你想在Windows10系统中回退到上一个版本,可以按照以下步骤进行操作:1.打开设置:点击Windows开始按钮,然后点击屏幕左侧的“设置”图标,或者使用键盘快捷键Win+I打开设置。2...

营业厅一个路由器多少钱(上门更换路由器收费吗)

移动免费装宽带活动全国都在搞,不过免费是有“门槛”的。以我所在的地区为例,只有月费在78元及以上的大流量套餐用户,才可以享受免费安装移动的宽带。月费越高,宽带的速率也越高,148元档可以安装200M的...

win10从u盘启动怎么设置(win10怎么从u盘启动电脑)

1.回到桌面。点击开始徽标,点击开始菜单左侧的设置。2.设置界面点击更新和安全。3.进入更新和安全界面,点击左侧的恢复选项。4.进入恢复界面,点击高级启动下面的立即重新启动。5.插入自己的U盘,等待...

系统大全网站(系统大全网站推荐)

下载时发生错误可能是以下原因:1.你的网速过慢,网页代码没有完全下载就运行了,导致不完整,当然就错误了。请刷新。2.网页设计错误,导致部分代码不能执行。请下载最新的遨游浏览器。3.你的浏览器不兼容导致...

win10官方启动盘(win10官方启动盘怎么用)

1、在开始菜单搜索“设置”,打开“设置”;2、点击“更新与安全”,在左侧菜单栏点击“恢复”;3、点击“启动项”,在弹出的窗口中会显示当前可以启动的项目,点击“编辑”;4、在打开的“编辑启动项”窗口中,...

win10系统安装不了(win10 安装不了)

电脑装不上win10系统可能是因为以下几个原因导致的原因一:win10安装文件不对我们在安装win10之前,要确保下载到安装包真实可用的,否则安装肯定会有问题,建议下载安全可靠的安装包!原因二:系统文...

国内dns哪个最快(dns开启好还是关闭好)

移动dns设置首选114.114.114.114,它又好又快。首选DNS和备用DNS都是一种域名系统,这两种域名系统有着先后之分,如果在首选DNS正常的情况下,就用首选DNS地址。当首选DNS服务器出...

winxp安装盘(winxp系统安装)

xp系统安装步骤如下1、将下载的xp系统iso压缩包文件下载到C盘之外的分区,比如下载到D盘,右键使用WinRAR等工具解压到当前文件夹或指定文件夹,不能解压到C盘和桌面,否则无法安装;?2、解压之后...

现在的win11稳定了吗(win11稳定嘛)

windows10更稳定,由于win11刚刚推出没多久,稳定差不够好,兼容性也有待提升,无论是应用还是游戏都会遇到不明程度的问题,因此,在日常的使用过程中,我们还是应当以稳定性为优先,选择win10是...

取消回复欢迎 发表评论: