Python进阶学习修改闭包内使用的外部变量
作者:落雨 发布时间:2023-04-09 01:23:04
标签:Python,闭包,变量修改
修改闭包内使用的外部变量
错误示例:
# 定义一个外部函数
def func_out(num1):
# 定义一个内部函数
def func_inner(num2):
# 这里本意想要修改外部num1的值,实际上是在内部函数定义了一个局部变量num1
num1 = 10
# 内部函数使用了外部函数的变量(num1)
result = num1 + num2
print("结果是:", result)
print(num1)
func_inner(1)
print(num1)
# 外部函数返回了内部函数,这里返回的内部函数就是闭包
return func_inner
# 创建闭包实例
f = func_out(1)
# 执行闭包
f(2)
错误示例:
# 定义一个外部函数
def func_out(num1):
# 定义一个内部函数
def func_inner(num2):
# 这里本意想要修改外部num1的值,实际上是在内部函数定义了一个局部变量num1
nonlocal num1 # 告诉解释器,此处使用的是 外部变量a
# 修改外部变量num1
num1 = 10
# 内部函数使用了外部函数的变量(num1)
result = num1 + num2
print("结果是:", result)
print(num1)
func_inner(1)
print(num1)
# 外部函数返回了内部函数,这里返回的内部函数就是闭包
return func_inner
# 创建闭包实例
f = func_out(1)
# 执行闭包
f(2)
小结
修改闭包内使用的外部函数变量使用 nonlocal 关键字来完成。
闭包与闭包中修改外部变量
在函数嵌套的前提下,内部函数引用了外部函数的变量,并且外部函数返回(return)了内部函数,即外部函数返回了引用了外部函数变量的内部函数,这时我们称内部函数为闭包。 比如说如下例子:
# 外部函数
def func_outer(a):
# 内部函数
def func_inner(b):
c = a + b
return c
return func_inner
# 创建闭包实例
f = func_outer(1)
# 执行闭包
num1 = f(2)
num2 = f(3)
print(num1)
print(num2)
在这里,f就叫做闭包的实例,func_inner函数就叫做闭包 此时执行结果如下:
可以见得,f里封存了外部函数的变量1,当闭包实例建立出来,再实行闭包实例,此时相当于1+2和1+3,得到了如上结果。 使用debug可以查看到,执行完f = func_outer(1)代码后,此时一个函数对象已经保存在内存当中:
当一开始步入代码num1 = f(2)(实行闭包)后:
一个外部函数.内部函数的对象存储在了内存中,注意:在执行完f = func_outer(1)并没有立即产生这样一个对象,而是在调用时才会产生该对象 这时,再步入内部函数:
这样c=3便出现了,此时在打印c就会出现3,4的出现与3的原理一样
修改外部函数的变量
代码如下:
# 外部函数
def func_outer(a):
# 内部函数
def func_inner(b):
nonlocal a
a = 2
c = a + b
return c
return func_inner
# 创建闭包实例
f = func_outer(1)
# 执行闭包
num1 = f(2)
num2 = f(3)
print(num1)
print(num2)
多了一行nonlocal a 这里的nonlocal关键字是声明我这里用的是外部的a,而不是自己新定义的局部变量a
来源:https://cloud.tencent.com/developer/article/1952408
0
投稿
猜你喜欢
- 这个使用起来很简单,以前需要的时候在网上找的,用了感觉还不错,具体的看演示就明白了。,这个可以保留你文章中的html标记,需要你修改的就是下
- 本文实例讲述了js实现适用于素材网站的黑色多级菜单导航条效果。分享给大家供大家参考。具体如下:这是一款适用于素材网站的黑色多级菜单导航条,无
- 下面是用python写的,使用lxml来做html分析,从网上看到的,说是分析速度最快的哦,不过没有验证过。好了,上代码。 import u
- 逛网站的时候经常会遇到需要上传图片的操作,这里主要来说下selenium操作上传文件的操作。前提条件:定位的元素必须是type 属性是fil
- 我有一张这样的产品零件表:部分part_id part_type product_id-------------
- 1、卓越亚马逊的首页轮换图片,每刷新一次,都是随机不同的顺序显示,这样的设计解决了对于较多图片轮换而靠后的图片信息很少被看到的问题,这点对于
- 本文实例讲述了python实现读取excel文件中所有sheet操作。分享给大家供大家参考,具体如下:表格是这样的 实现把此文件所
- HTTP-REFERER这个变量已经越来越不可靠了,完全就是可以伪造出来的东东。 以下是伪造方法:ASP/Visual Basic代码 di
- 边缘检测Canny边缘检测器是一种被广泛使用的算法,并被认为是边缘检测最优的算法,该方法使用了比高斯差分算法更复杂的技巧,如多向灰度梯度和滞
- 概念MySQL5.0版本开始支持存储过程,存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法
- Python3进制之间的转换在Python里面实现进制之间的转换是非常方便的,有专门的函数来进行这个操作:下面直接上代码:# 进制之间的转换
- java通过mysql的加解密函数实现敏感字段存储1.AES加解密工具类:public class AESUtils {public sta
- 无论安装以下哪种库,强烈建议在新环境下安装,之前在base环境下安装各种报错!!!如何在新环境下安装可参见我之前的总结或网上其他文章。不推荐
- 前言:我们常常想使用数组的方法,比如forEach,filter,又或者some等等来处理非数组的数据类型,那么在这些场景下,我们就需要将非
- 本文实例为大家分享了JS实现canvas简单小画板的具体代码,供大家参考,具体内容如下Html部分:<!DOCTYPE html>
- 下面是Python字符串的一些微妙的特性,绝对会让你大吃一惊。案例一:案例二:案例三:很好理解, 对吧?说明:这些行为是由于 Cpython
- 一、前言关于什么是Dapper(详细入口),在此不做赘述;本文仅对Dapper在.Net Core中的使用作扼要说明,所陈代码以示例讲解为主
- python提高图像质量概述调研了一些提高图像质量的方式深度学习方法,如微软的Bringing-Old-Photos-Back-to-Lif
- 原来的语句是这样的: select sum(sl0000) from xstfxps2 where dhao00 in ( select d
- 本篇文章将讨论使用 Python 中的四种不同方法来使用、管理秒并将其转换为天、小时、分钟和秒。现在,让我们开始讨论这些方法并在一些示例中使