题目:

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

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

'''

遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939

寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!

'''

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 ,直接运行

python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解相关推荐

  1. Python中使用BeautifulReport形成测试报告教程

    Python中使用BeautifulReport形成测试报告教程 pyton中使用BeautifulReport形成测试报告需要先安装BeautifulReport模块 打开cmd窗口输入 pip i ...

  2. 在Python中使用HTML模版的教程

    在Python中使用HTML模版的教程 转载  2018-02-12   作者:廖雪峰 这篇文章主要介绍了在Python中使用HTML模版的教程,HTML模版也是Python的各大框架下的一个基本功能 ...

  3. Python中安装PyOpenGL:详细教程

    Python中安装PyOpenGL:详细教程 如果你对Python编程有一定的了解,并且在计算机图形学领域有所涉猎,你可能会使用到PyOpenGL.PyOpenGL是Python的一个OpenGL绑定 ...

  4. Python中常用最神秘的函数! lambda 函数深度总结!

    今天我们来学习 Python 中的 lambda 函数,并探讨使用它的优点和局限性 Let's do it! 什么是 Python 中的 Lambda 函数 lambda 函数是一个匿名函数(即,没有 ...

  5. Python中深浅拷贝的案例教程

    在本节中,您将通过运行Python中的浅拷贝和深拷贝实例来理解copy模块创造副本的不同. 在Python中复制对象 在Python中,我们使用=运算符来创建对象的副本.您可能会认为这会创建一个新对象 ...

  6. 如何在python中安装Gurobi(详细教程)

    最近在python中需要用Gurobi ,看了一下别人的教程,感觉不太满意,自己安装了一下,顺便梳理一下过程. 第一步 :下载gurobi ( http://www.gurobi.com ) 下载教程 ...

  7. python教程实例-Python中函数的用法实例教程

    本文以数值计算为例讲述了Python中函数的用法,分享给大家供大家参考借鉴之用.具体如下: 我们都知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需 ...

  8. python中format的用法菜鸟教程-初学者必知的Python中优雅的用法

    枚举 之前我们这样操作: i = 0 for item in iterable: print i, item i += 1 现在我们这样操作: for i, item in enumerate(ite ...

  9. python中PIL的安装参考教程

    相信不少同学想使用python处理一些RGB的图片,但是对于python又不熟悉,处于白菜阶段,没错就是和我一样,今天刚好有这样一个任务需要读取RGB图像的像素值,其实就是灰度值.之前采用matlab ...

最新文章

  1. 任正非最新内部信:过去只为赚点小钱,现在要用5G+AI战胜美国
  2. HTML5 应用程序缓存
  3. pass4side IBM 000-M15
  4. 语音识别:时间序列Damerau–Levenshtein距离
  5. jenkins active exited(待编辑)
  6. 在 MFC SDI 程序中实现多语言程序界面
  7. 【图文详解】JAVA字面量和变量
  8. 那些拧不开瓶盖的女生全都是装的?理工男这样想......
  9. 利用dbms_metadata.get_ddl查看DDL语句
  10. Vue2 模板template的四种写法总结
  11. 设置 ASP.NET 存储当前应用程序的临时文件(生成的源、编译了的程序集等)的目录的物理路径。...
  12. Android 中文件类型与MIME的匹配表
  13. win8系统装c语言编程软件哪个好,win8系统安装c语言方法
  14. 4.Node.js 微信消息管理
  15. PHP实现微博的同步发送(转)
  16. Rational ClearCase批量merge合并
  17. Flash遮罩——水波、瀑布
  18. Linux网络操作系统及应用教程( 项目式)项目二
  19. 国产性能最稳定NFC读卡器芯片FSV9520完美替代CV520 SPI接口 可免费提供软硬件DEMO 快速研发产品
  20. Safari浏览器兼容性问题处理

热门文章

  1. micrometer_具有InlfuxDB的Spring Boot和Micrometer第1部分:基础项目
  2. zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?
  3. java6 已安装更高版本_Java 10及更高版本的思考
  4. java8默认垃圾收集器_Java 8中最快的垃圾收集器是什么?
  5. if else 工厂模式_没有IF-ELSE的工厂
  6. 艾伦图灵_Java英雄:丹·艾伦
  7. 关于高效企业测试的思考(1/6)
  8. 使用ArchUnit验证代码和体系结构约束
  9. hibernate jpa_JPAHibernate替代方案。 如果JPA或Hibernate对于我的项目而言不够好,该怎么办?...
  10. AWS Messaging Services:选择合适的服务