在函数嵌套的前提下,内部函数引用了外部函数的变量,并且外部函数返回(return)了内部函数,即外部函数返回了引用了外部函数变量的内部函数,这时我们称内部函数为闭包。
比如说如下例子:

# 外部函数
def func_outer(a):# 内部函数def func_inner(b):c = a + breturn creturn 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 aa = 2c = a + breturn creturn func_inner# 创建闭包实例
f = func_outer(1)
# 执行闭包
num1 = f(2)
num2 = f(3)
print(num1)
print(num2)

多了一行nonlocal a 这里的nonlocal关键字是声明我这里用的是外部的a,而不是自己新定义的局部变量a

python——闭包与闭包中修改外部变量相关推荐

  1. python函数内部变量能改变外部吗_python中,如何利用函数修改外部变量,注意我的要求...

    问 题 void swap(int *p1, int *p2){ int temp; //临时变量 temp = *p1; *p1 = *p2; *p2 = temp; } int main(){ i ...

  2. 【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )

    文章目录 一.直接修改 和 间接修改 指针变量 的值 二.在函数中 间接修改 指针变量 的值 三.在函数中 间接修改 外部变量 的原理 一.直接修改 和 间接修改 指针变量 的值 直接修改 指针变量 ...

  3. python中字符串怎么引用_Python:字符串中引用外部变量的3种方法

    方法一: username=input('username:') age=input('age:') job=input('job:') salary=input('salary') info1='' ...

  4. 【C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入的参数要求 | 参数作返回值 )

    文章目录 I . 博客总结 . 指针与引用类型参数 II . 指针作为参数和返回值 III . 引用参数简介 IV . 引用作为参数和返回值 I . 博客总结 . 指针与引用类型参数 1 . 讨论问题 ...

  5. 能否用痰盂盛饭——谈谈在头文件中定义外部变量

    能否用痰盂盛饭--谈谈在头文件中定义外部变量 - garbageMan - 博客园 能否用痰盂盛饭--谈谈在头文件中定义外部变量 "能否用痰盂盛饭"并非是一个技术问题,而是一个哲学 ...

  6. 如何在vue项目中修改less变量,多主题项目解决方案

    如何在vue项目中修改less变量,多主题项目解决方案 参考文章: (1)如何在vue项目中修改less变量,多主题项目解决方案 (2)https://www.cnblogs.com/niubilit ...

  7. linux环境配置以后生效,Linux中修改环境变量及生效方法

    Linux中修改环境变量及生效方法 在/etc/profile文件中添加变量[对所有用户生效(永久的)] 用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且 ...

  8. linux环境变量生效方式,Linux中修改环境变量及生效方法

    Linux中修改环境变量及生效方法 方法一: 在/etc/profile文件中添加变量[对所有用户生效(永久的)] 用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户 ...

  9. 中修改环境变量_Golang入门(1):安装与配置环境变量的意义

    摘要 在几年前学习Java的时候,环境的配置就会劝退一部分的初学者.而对于Golang来说,也需要从环境的配置开始学起.这一篇文章将从如何安装Golang开始讲起,随后将会提到Golang中的环境变量 ...

最新文章

  1. 【转】Usage of sendBroadcast()
  2. 抛出这8个问题,检验你是否真的会ThreadLocal
  3. 5.1.3 IO控制方式
  4. oracle expdp 39002,expdp 导入数据时ORA-39002、ORA-39070错误排查
  5. vscode 执行npm命令_生产力终极指南:用了两年,如今才算真正会用VS Code
  6. 学校计算机考察内容是什么意思,2019考研计算机复试四项考察内容分析及注意事项...
  7. 算法工程师面试备战笔记12_决策树
  8. Objectove-c单例模式
  9. 学会java要多久_多长时间可以学会Java?
  10. Parser-Free Virtual Try-on via Distilling Appearance Flows代码解析
  11. 计算机程序考试试题及答案,计算机程序员考试试题及答案.doc
  12. java 读取换行_Java中的换行字符读取 - java
  13. 相片打印机原理_手机照片打印机的原理是什么 便携式照片打印机到底好不好...
  14. 记 flip 简单的动画思路
  15. 一道简单的电商数据分析笔试题:求组合商品的库存量
  16. python Flask 10 Flask请求上下文管理werkzeug
  17. html源代码资源网,利用HTML源代码,挖掘网络资源
  18. 系统辨识的几种方法实现MATLAB代码
  19. 富文本框让最大四百像素_8 大功能,适合摄影师、设计师的开源工具集
  20. 【LeetCode】1641. Count Sorted Vowel Strings(动态规划)

热门文章

  1. POJ 2312 Battle City 优先队列+BFS
  2. 自己实现一个和PYTHON的库一模一样的sha_256算法
  3. 这份书单,给那些想学Hadoop大数据、人工智能的人
  4. 基础知识巩固四(问题部分)
  5. 用Code::Blocks Code profiler插件剖析程序性能
  6. iOS-NSThread编程详解
  7. User profile synchronization service starting issues 用户配置文件同步服务启动问题
  8. Mybatis传入参数map,读取map原创
  9. 关于项目中属性配置文件的改进
  10. 操作系统实验报告13:线程池简单实现