教程集 www.jiaochengji.com
教程集 >  Python编程  >  Python入门  >  正文 Python新手常见问题六:闭包时绑定变量

Python新手常见问题六:闭包时绑定变量

发布时间:2021-12-27   编辑:jiaochengji.com
教程集为您提供Python新手常见问题六:闭包时绑定变量等资源,欢迎您收藏本站,我们将为您提供最新的Python新手常见问题六:闭包时绑定变量资源

搞不清楚在闭包(closures)中Python是怎样绑定变量的

看这个例子:

<pre class="brush:php;toolbar:false">>>> def create_multipliers(): ...     return [lambda x : i * x for i in range(5)] >>> for multiplier in create_multipliers(): ...     print multiplier(2) ...</pre>

期望得到下面的输出:

<pre class="brush:php;toolbar:false">0 2 4 6 8</pre>

但是实际上得到的是:

<pre class="brush:php;toolbar:false">8 8 8 8 8</pre>

意外吧!

相关推荐:《Python视频教程》

这是由于Python的后期绑定(late binding)机制导致的,这是指在闭包中使用的变量的值,是在内层函数被调用的时候查找的。因此在上面的代码中,当任一返回函数被调用的时候,i的值是在它被调用时的周围作用域中查找(到那时,循环已经结束了,所以i已经被赋予了它最终的值4)。

解决的办法比较巧妙:

<pre class="brush:php;toolbar:false">>>> def create_multipliers(): ...     return [lambda x, i=i : i * x for i in range(5)] ... >>> for multiplier in create_multipliers(): ...     print multiplier(2) ... 0 2 4 6 8</pre>

这下对了!这里利用了默认参数去产生匿名函数以达到期望的效果。有人会说这很优美,有人会说这很微妙,也有人会觉得反感。但是如果你是一名Python程序员,重要的是能理解任何的情况。

相关推荐:

Python新手常见问题五:在遍历列表的同时又修改该列表

您可能感兴趣的文章:
Python新手常见问题六:闭包时绑定变量
Python新手常见问题七:循环加载模块
一起来看看Python中常见的陷阱
理解Javascript的闭包
Python新手常见问题三:在异常处理时错误的使用参数
新手常遇到的一些jquery问题整理
Python新手常见问题十:__del__方法
fluent python是什么意思
理解Javascript闭包
Python新手常见问题四:误用Python作用域的规则

[关闭]
~ ~