资讯专栏INFORMATION COLUMN

对 a = [lambda : x for x in range(3)] 的理解

cocopeak / 1260人阅读

摘要:上面的语句创建了一个列表,其中有三个元素,每个元素都是一个匿名函数。以下的例子就可以很清晰地说明这个问题。的循环并不会引入新的作用域,因此当最后调用函数的时候,实际上是把当前的值传递了进去,而当我们更改了的值后,函数的返回值也就相应改变了。

上面的语句创建了一个列表 a ,其中有三个元素,每个元素都是一个 lambda 匿名函数。

>>> a = [lambda : x for x in range(3)]
>>> a
[. at 0x7f79c874ae18>, 
. at 0x7f79c874aea0>, 
. at 0x7f79c874af28>]
>>> a[0]()
2
>>> a[1]()
2
>>> a[2]()
2
>>>

可是为什么三个函数的返回值都为 2 呢?

这是因为函数创建的时候,并没有传递参数,而只有当我们最后调用三个函数的时候,这时候 x 才被作为实参传递进 lambda 函数,而此时的 x = 2,所以三个函数的返回值都为 2。

以下的例子就可以很清晰地说明这个问题。

>>> a = []
>>> for i in range(3):
...     a.append(lambda:i)
... 
>>> a
[ at 0x7f79c88022f0>, 
 at 0x7f79c8802378>, 
 at 0x7f79c8802400>]
>>> a[0]()
2
>>> a[1]()
2
>>> a[2]()
2
>>> i
2
>>> i = 10
>>> a[2]()
10
>>> 

Python 的 for 循环并不会引入新的作用域,因此当最后调用 lambda 函数的时候,实际上是把当前 i 的值 2 传递了进去,而当我们更改了 i 的值后,函数的返回值也就相应改变了。

再看下面这个例子。

>>> a = [lambda x=x : x for x in range(3)]
>>> a[0]()
0
>>> a[1]()
1
>>> a[2]()
2
>>> a[2](10)
10

这次,在循环过程中,我们创建函数的时候把 x 的值作为默认参数传递了进去,因此输出就变成了 0, 1, 2,相当于使用了默认参数。

而如果我们将列表替换成元组,a 就变成了一个生成器,看下面的例子。

>>> a = (lambda:x for x in range(3))
>>> a
 at 0x7f79c8f08200>
>>> next(a)
. at 0x7f79ca827f28>
>>> next(a)
. at 0x7f79c88022f0>
>>> next(a)
. at 0x7f79ca827f28>
>>> next(a)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration
>>> a = (lambda:x for x in range(3))
>>> next(a)()
0
>>> next(a)()
1
>>> next(a)()
2
>>> next(a)()
Traceback (most recent call last):
  File "", line 1, in 
StopIteration
>>>

获取更多精彩,请关注「seniusen」!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44876.html

相关文章

  • python面试题之“该死for循环系列”(二)

    摘要:到这里,如果你明白了,我们就可以继续进行下一步了理解匿名函数。 似乎只要一沾上for循环,难度立刻加倍,下面我们来看一道python的面试题: 要求写出下面代码的输出结果并且解释原因。 def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()]) 这...

    shiweifu 评论0 收藏0
  • 由 sort 中 key 用法浅谈 python

    摘要:但是实际写程序中,我们经常会写出许多繁杂的丑陋的代码。特别推荐,许多代码让我获益匪浅,比如这里对的使用。用可以写出很简单直观的代码,如下当然,上面不考虑效率,这里有一个利用分治法思想的高效的方法。更多文章更多阅读中参数的用法高级编程技巧 用 Python 时间也算不短了,但总感觉自己在用写 C++ 代码的思维写 Python,没有真正用到其作为脚本语言的优势。之前刷 LeetCode ...

    keke 评论0 收藏0
  • [零基础学python]大话题小函数(2)

    摘要:上一讲和本讲的标题是大话题小函数,所谓大话题,就是这些函数如果溯源,都会找到听起来更高大上的东西。是提出的一个软件架构,用于大规模数据集大于的并行运算。 上一讲和本讲的标题是大话题小函数,所谓大话题,就是这些函数如果溯源,都会找到听起来更高大上的东西。这种思维方式绝对我坚定地继承了中华民族的优良传统的。自从天朝的臣民看到英国人开始踢足球,一直到现在所谓某国勃起了,都一直在试图论证足球起...

    leejan97 评论0 收藏0
  • Python 隐藏高级功能你都 get 到了吗?

    摘要:模块的模块是处理迭代器的工具集合。迭代器是一种可以在循环语句包括列表元组和字典中使用的数据类型。使用模块中的函数让你可以执行很多迭代器操作,这些操作通常需要多行函数和复杂的列表理解。 Python 多好用不用多说,大家看看自己用的语言就知道了。但是 Python 隐藏的高级功能你都 get 了吗?本文中,列举了 Python 中五种略高级的特征以及它们的使用方法,快来一探究竟吧! sh...

    k00baa 评论0 收藏0

发表评论

0条评论

cocopeak

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<