题目:

lst = [lambda x: x*i for i in range(4)]

res = [m(2) for m in lst]

print res

实际输出:[6, 6, 6, 6]

想要输出 [0, 2, 4, 6] 应该怎么改?如下:

lst = [lambda x, i=i: x*i for i in range(4)]

res = [m(2) for m in lst]

print res

这个问题涉及到了Python的闭包及延时绑定的知识(Python作用域)。

在Python核心编程里,闭包的定义如下:

如果在一个内部函数里,对外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认定是闭包。

总结为三点:

1、是一个内嵌函数

2、对外部函数变量引用

3、外部函数返回内嵌函数

简单的闭包例子:

def counter(start_at=0):

count = [start_at]

def incr():

count[0] += 1

return count[0]

return incr

上面的那道题,可以写成这样:

def func():

fun_list = []

for i in range(4):

def foo(x):

return x*i

fun_list.append(foo)

return fun_list

for m in func():

print m(2)

func()是一个包含四个函数的列表:

[, , , ]

当我们执行 m(2) 时,运行到foo()内部函数,发现变量 i 并不是foo()中的变量,于是就到外部函数func中寻找变量 i ,但此时外部的 for 已经循环完毕,最后的 i =3 。所以,每次

执行m(2),i 的值都是 3 ,因此,最终结果会是 [6, 6, 6, 6] 。

当在foo()中添加 i=i 后,即:

def func():

fun_list = []

for i in range(4):

def foo(x, i=i):

return x*i

fun_list.append(foo)

return fun_list

for m in func():

print m(2)

这样的话,for循环执行时,就已经把 i(0, 1, 2, 3) 的值传给了foo()函数,此时的 i 已经是foo()函数的内部变量,运行到foo()函数时,就不会到外部函数寻找变量 i ,直接运行

x*i(0, 1, 2, 3),因此最终结果会是 [0, 2, 4, 6] 。

python中延时函数_python延时绑定相关推荐

  1. python中pop函数_Python中的Pop函数

    python中pop函数 什么是弹出功能? (What is the pop function?) The method pop() removes and returns the last elem ...

  2. python中factor函数_Python入门-函数

    函数 在维基百科上函数式这样描述的: 函数在数学中为两集合间的一种对应关系:输入值集合中的每项元素皆能对应唯一一项输出值集合中的元素. 此处的函数区别于我们数学上的函数,在编程世界中,函数(Funct ...

  3. python中mat函数_Python中flatten( )函数及函数用法详解

    flatten()函数用法 flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组. flatten只能适用于numpy对象,即array或者mat,普通的list列 ...

  4. python中set函数_python中set()函数简介及实例解析

    set函数也是python内置函数的其中一个,属于比较基础的函数.其具体介绍和使用方法,下面进行介绍. set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并 ...

  5. python中property函数_python 邮件表格Python中property函数用法实例分析

    本文实例讲述了Python中property函数用法.分享给大家供大家参考,具体如下: 通常我们在访问和赋值属性的时候,都是在直接和类(实例的)的__dict__打交道,或者跟数据描述符等在打交道.但 ...

  6. python中help函数_Python help()函数

    python中help函数 Python help() function is used to get the documentation of specified module, class, fu ...

  7. python中exp函数_python中exp函数如何实现指数计算?

    原标题:python中exp函数如何实现指数计算? 之前小编向大家介绍过python中的对数函数log函数(https://www.py.cn/jishu/jichu/21780.html),对于有点 ...

  8. python中闭包函数_Python的闭包问题(关于内嵌函数引用闭包函数的变量问题)

    一.闭包: 记得:闭包的特性就是:内嵌函数会保存它引用的外围函数的变量值. 闭包概念:在一个内部函数中,对外部作用域的变量进行引用,(并且一般外部函数的返回值为内部函数),那么内部函数和被引用的变量等 ...

  9. python中choice函数_Python中choice函数的实现方法

    Python中choice函数的实现方法 发布时间:2020-12-15 09:28:06 来源:亿速云 阅读:82 作者:小新 这篇文章主要介绍Python中choice函数的实现方法,文中介绍的非 ...

  10. python中locals函数_python中locals函数的作用是什么?

    在python中,每个模块拥有它自已的名字空间,即全局名字空间.它记录了模块的变量,包括函数.类.其它导入的模块.模块级的变量和常量,方便python的使用.python中字典的使用也是很常见的,使用 ...

最新文章

  1. SQL Server数据类型
  2. 第三十课.向量胶囊与动态路由
  3. 什么是python中子类父类_零基础入门:python中子类继承父类的__init__方法实例
  4. 【已解决】R read.table()报错:incomplete final line found by readTableHeader
  5. 中国版“微软”要来了?某国产操作系统称已可以替代Windows 7
  6. html中从下往上遮罩效果,css制作从下往上逐渐显示的div
  7. Codeforces Round #712 (Div. 2) F. Flip the Cards 思维 + 贪心
  8. SmartBear继SoapUI Pro 5 2之后推出新版本改名SoapUI NG Pro
  9. PYQT之- QObject与线程QThread的关系
  10. easyui模板中的disabled的使用
  11. DataGridView显示时间格式
  12. idea上传代码到github (图文并茂)
  13. 网页集成高德地图显示
  14. 程序员,你何时离开北京
  15. 【Pytorch实战4】基于CIFAR10数据集训练一个分类器
  16. xbox蓝牙手柄驱动_如何通过蓝牙将Xbox One控制器连接到Windows
  17. Idea如何设置类头注释(图片步骤直接到位)
  18. ffmpeg在低版本VS中的编译
  19. 《ssh权威指南》书评
  20. OnlyOffice 二次开发定制化部署

热门文章

  1. 斯坦福大学计算机科学的研究成果,美国斯坦福大学Leonidas Guibas教授做客青岛校区作学术报告...
  2. Windows Key
  3. Codeforces--- Dubstep
  4. 【Java中的四种线程池】
  5. Python——【自制搜索小工具】
  6. 分治算法解决大整数乘法问题
  7. 2021-01-15门卫思想和巨人的肩膀
  8. Python+Opencv实现简单PCA人脸识别
  9. 程序员至死是少年!在公司竟公然变身圣斗士
  10. pngquant php,如何在PHP中使用pngquant