题目:

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] += 1return count[0]return incr

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func():fun_list = []for i in range(4):def foo(x):return x*ifun_list.append(foo)return fun_list
for m in func():print m(2)

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

[<function func at 0x00000000021CE9E8>, <function func at 0x00000000021CEA58>, <function func at 0x00000000021CEAC8>, <function func at 0x00000000021CEB38>]

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

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

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func():fun_list = []for i in range(4):def foo(x, i=i):return x*ifun_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教程:关于 [lambda x: x*i for i in range(4)] 理解相关推荐

  1. python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解

    题目: lst = [lambda x: x*i for i in range(4)] res = [m(2) for m in lst] print res 实际输出:[6, 6, 6, 6] 想要 ...

  2. Python教程:lambda,filter,map的运用

    1.在学完定义函数def后,又接触了个新的知识,lambda,这个简直可以替代定义函数def啊.用它时,不需要一堆命名,单独定义某个字符,上来直接就是你想的结果,简直是发现新大陆了!不说了,上例子!看 ...

  3. Python教程:内置函数filter()和匿名函数lambda解析

    一.内置函数filter filter()函数是 Python 内置的一个高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回由符合条件迭代器 ...

  4. Python教程:对 a = [lambda : x for x in range(3)] 的理解

    上面的语句创建了一个列表 a ,其中有三个元素,每个元素都是一个 lambda 匿名函数. >>> a = [lambda : x for x in range(3)] >&g ...

  5. lambda在python_在Python中使用lambda高效操作列表的教程

    介绍 lambda Python用于支持将函数赋值给变量的一个操作符 默认是返回的,所以不用再加return关键字,不然会报错 result = lambda x: x * x result(2) # ...

  6. Python 匿名函数 lambda - Python零基础入门教程

    目录 一.Python 匿名函数 lambda 语法 二.Python 匿名函数 lambda 调用 1.lambda 匿名函数常规使用 2. lambda 匿名函数使用不定长参数 3. lambda ...

  7. 电脑下载python教程-python教程pdf下载

    python教程目录介绍 前言 Front Matter Contents 1. 开胃菜 Whetting Your Appetite 2. 使用Python解释器 Using the Python ...

  8. Python教程:列表推导式和嵌套的列表推导式讲解

    1.列表推导式 列表推导式提供了一个更简单的创建列表的方法.常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列. 例如,假设我 ...

  9. vue函数如何调用其他函数?_好程序员Python教程系列之递归函数与匿名函数调用...

    好程序员Python教程系列递归函数与匿名函数调用,函数是Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名函数两种函数 ...

最新文章

  1. 【算法笔记】莫比乌斯反演(包含定理,两种形式的证明及入门经典模板)
  2. wireshark tcp data中文_TCP的可靠传输
  3. [YTU]_2619 (B 友元类-计算两点间距离)
  4. linux apr文件解压失败,Linux安装apache服务器遇到的问题
  5. 2.3.5 操作系统之信号量机制实现进程的互斥、同步与前驱关系
  6. 前端学习(1424):ajax低版本兼容问题
  7. vue学习笔记-02-前端的发展历史浅谈mmvm设计理念
  8. 数据结构之查找算法:折半查找
  9. Learning-Python【0】:Windows环境下Python2和Python3的安装
  10. Kafka产品迭代计划(RoadMap)
  11. 超实用的mysql分库分表策略,轻松解决亿级数据问题
  12. DST(对话状态追踪)常用方法
  13. 手电筒安卓_王思聪吃热狗数字时钟安卓apk下载安装ios现在
  14. 2016杭州云栖大会随笔
  15. Cisco_路由器基础命令
  16. React Suspense 尝鲜,处理前后端IO异步操作
  17. 【软件测试面试】面试技巧,让面试官记住的自我介绍,疯狂收割offer.....
  18. iPad 手指触摸与PC鼠标事件
  19. UVa Problem 10254 The Priest Mathematician (牧师数学家)
  20. 面试官问了我7个问题,场面一度很尴尬

热门文章

  1. linux虚拟机网络设置(本机使用公司内网)
  2. 掌握Angular2的服务(service)
  3. HDU1257 最少拦截系统(下降自序列个数)
  4. JS三教九流系列-require.js-网站模块化开发
  5. JavaScript的变量作用域深入理解(转)
  6. Javascript模板引擎handlebars使用实例及技巧
  7. Eucalyptus系统部署
  8. 文件管理的艺术之SVN从零搭建
  9. Ubuntu 中安装 Oracle 10g
  10. 计算机在课堂中的应用论文,任务教学法在计算机教学中的应用论文