由于Python中,变量作用域为LEGB,所以在函数内部可以读取外部变量,但是在函数外不能读取函数内的变量。但是出于种种原因,我们需要读取函数内的变量时候怎么办?那就是在函数内在加一个函数。

 def outer():
x = 5
def inner():
print(x)
return inner a = outer()
a()#print 5

这样,我们就可以看到函数内部的变量了。

上面的inner就是闭包,闭包就是能够读取其他函数内部变量的函数,也就是定义在函数内部的函数,在本质上来说,闭包就是连接函数内和函数外的桥梁。同时,闭包也可以理解为可以携带状态的函数,可以用这个特性构建类似于类private变量,携带状态的回调函数等。

闭包有两大作用,一个是像上面的可以读取函数内部的变量,一个是让这些变量的值始终保存在内存中。

 def outer():
n = 999
def tr():
nonlocal n
n = n+1
def inner():
print(n)
return tr,inner tr,a = outer()
a()#print999
tr()
a()#print1000

因为outer为inner的父函数,而inner被赋值给了一个全局变量,这导致inner和inner依赖的outer常驻内存

需要注意的是,返回的函数并没有立马执行,直到调用时候才开始执行。

def outer():
acts = []
for i in range(5):
acts.append(lambda x:i**x)
return acts acts = outer()
for i in range(5):
print(acts[i](2))
#print
#
#
#
#
#

输出为五个16而不是我们想要的结果,为什么?

就是因为act[i]在内存中一直没有执行,一直等到调用才开始执行的,那怎么办?

方法就是用函数的参数绑定循环变量的值,这样无论循环变量的值怎么改变,已经绑定到函数参数的值不会改变

 def outer():
acts = []
for i in range(5):
acts.append(lambda x,i=i:i**x)
return acts acts = outer()
for i in range(5):
print(acts[i](2))
#print
#
#
#
#
#

使用闭包时候要注意:

1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

参考资料:学习javascript闭包

      Javascript闭包

     Python学习手册p431

     Python Cookbook

Python闭包Closure 2的更多相关文章

  1. python 闭包(closure)

    闭包的定义: 闭包就是一个函数,这个函数可以记住封闭作用域里的值,而不管封闭作用域是否还在内存中. 来一个例子: def happy_add(a): print 'id(a): %x' % id(a) ...

  2. python闭包closure

    在讨论闭包之前,先总结一下python的命名空间namespace,一般的语言都是通过namespace来识别名字标识,无论是变量,对象,函数等等.python划分3个名字空间层次,local:局部, ...

  3. python 闭包 Closure 函数作为返回值

    一.函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. >>> def lazy_sum(*args): ... def sum(): ... ax = ...

  4. python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)

    1.函数对象 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函 ...

  5. Python 闭包(Closure)

    Python  闭包 (Closure) 这里介绍一下python 的闭包 基本概念 闭包(closure)是函数式编程的重要的语法结构. 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函 ...

  6. 【Python】闭包Closure

    原来这就是闭包啊... 还是上次面试,被问只不知掉js里面的闭包 闭包,没听过啊...什么是闭包 回来查了下,原来这货叫闭包啊...... —————————————————————————————— ...

  7. Python 闭包

    什么是闭包? 闭包(closure)是词法闭包(lexical closure)的简称.闭包不是新奇的概念,而是早在高级程序语言开始发展的年代就已产生. 对闭包的理解大致分为两类,将闭包视为函数或者是 ...

  8. Python闭包与javascript闭包比较

    实例一 python def line_conf(): def line(x): return 2*x+1 print(line(5)) # within the scope     line_con ...

  9. Python闭包与函数对象

    1. Python闭包是什么 在python中有函数闭包的概念,这个概念是什么意思呢,查看Wikipedia的说明如下: “ In programming languages, closures (a ...

随机推荐

  1. R8—批量生成文件夹,批量读取文件夹名称+R文件管理系统操作函数

    一. 批量生成文件夹,批量读取文件夹名称 今日,工作中遇到这样一个问题:boss给我们提供了200多家公司的ID代码(如6007.7920等),需要根据这些ID号去搜索下载新闻,从而将下载到的新闻存到 ...

  2. 20155232 2016-2017-3 《Java程序设计》第7周学习总结

    20155232 2016-2017-3 <Java程序设计>第7周学习总结 教材学习内容总结 第十三章 1.Greenwich MeanTime,格林威治时间,简称GMT时间,由观察太阳 ...

  3. 基本控件文档-UILabel属性

    CHENYILONG Blog 基本控件文档-UILabel属性 Fullscreen UILabel属性技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http ...

  4. opencv的基本数据结构(一)(转)

    从2001年以来,opencv的函数库一直是基于C接口构建的,因此在opencv1.0版本中,一般使用IplImage的C结构体在内存中存储图像,因此,我们在很多较经典的书籍或者开源项目中依然可见Ip ...

  5. 未来人类T5 安装win10,ubuntu双系统

    1.首先确保win10已经安装,u盘中已刻录好系统,下载好英伟达最新驱动保存在u盘中,压缩100g的磁盘空间给ubuntu. 2.设置双显卡模式,重启时按F7选择进入u盘启动. 3.进入安装界面,选择 ...

  6. Remove K Digits

    Given string A representative a positive integer which has N digits, remove any k digits of the numb ...

  7. aarch64_m1

    MAKEDEV-3.24-18.fc26.aarch64.rpm 2017-02-14 08:46 99K fedora Mirroring Project MUMPS-5.0.2-8.fc26.aa ...

  8. vue2.0组件之间的传值

    1.父子组件--props props:需要注意的是,虽然的是单向的数据流,但是如果传递的是数组或是对象这样的引用类型,子组件数据变化,父组件的数据通也会变化 子组件代码 <template&g ...

  9. Java OOM学习

    转载自原文: 什么是java OOM?如何分析及解决oom问题? 什么是OOM? OOM,全称"Out Of Memory",翻译成中文就是"内存用完了",表现 ...

  10. sql server中扩展存储过程

    --列出服务器上安装的所有OLEDB提供的程序 execute master..xp_enum_oledb_providers --得到硬盘文件信息 --参数说明:目录名,目录深度,是否显示文件 (少 ...