一个Python引用引起的困惑
2011-04-02 14:25
85 查看
(转载请注明原创于潘多拉盒子)
先来看一段程序:
funs = [lambda x: x**k for k in range(0, 4)]
res = [f(2) for f in funs]
print res
结果是什么呢?
结果是这样的:[8, 8, 8, 8],如果不感到意外,说明你已经理解了python,或者没看懂:)
如果意外,请看下面的分析:
实际上,[lambda x: x**k for k in range(0, 4)],创建了4个lambda表达式,每个表达式都是
lambda x: x**k,而k最终是等于3。于是4个lambda表达式都是lambda x: x**3 !
怎样才能根据不同的k生成不同的表达式呢?原因是要对k生成多个对象!!
函数的参数是作为引用传入的,因此我们可以对lambda表达式增加一个参数,k:
funs = [lambda x, k=k: x**k for k in range(0, 4)]
重新运行程序,得到res的值为
[1, 2, 4, 8]!
神奇的python!
如果你是一个python程序员,不清楚python的引用机制,你将时常困惑。
先来看一段程序:
funs = [lambda x: x**k for k in range(0, 4)]
res = [f(2) for f in funs]
print res
结果是什么呢?
结果是这样的:[8, 8, 8, 8],如果不感到意外,说明你已经理解了python,或者没看懂:)
如果意外,请看下面的分析:
实际上,[lambda x: x**k for k in range(0, 4)],创建了4个lambda表达式,每个表达式都是
lambda x: x**k,而k最终是等于3。于是4个lambda表达式都是lambda x: x**3 !
怎样才能根据不同的k生成不同的表达式呢?原因是要对k生成多个对象!!
函数的参数是作为引用传入的,因此我们可以对lambda表达式增加一个参数,k:
funs = [lambda x, k=k: x**k for k in range(0, 4)]
重新运行程序,得到res的值为
[1, 2, 4, 8]!
神奇的python!
如果你是一个python程序员,不清楚python的引用机制,你将时常困惑。
相关文章推荐
- python类中显示重写__del__方法引起循环引用的对象无法释放,一种循环引用的检测方法
- 关于python同一个文件夹里面不同.py文件的交叉引用
- Python 一个奇特的引用设定
- 【python爬虫】import引起的一个小bug【原创】
- 一个困惑引起的思考
- python中关于class类中一个实例变量的引用问题
- Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
- Python的引用、浅拷贝、深拷贝的一个很好的小例子
- python引用和复制一个对象
- Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
- 一个ON_COMMAND_RANGE( id1, id2, memberFxn ) 函数引起的困惑
- 使用 EntityFramework后把一个对象序列化成json字符串引起循环引用的问题
- Python-一个因浅复制和深复制引起的bug
- python对象引用引起的问题
- 深入分析在Python模块顶层运行的代码引起的一个Bug
- 深入分析在Python模块顶层运行的代码引起的一个Bug
- Python中的可变,不可变对象;值类型,引用类型;浅拷贝,深拷贝理解
- 一个计算机专业毕业生工作5年后的困惑
- 一个简单的不用cookie的人人网状态爬取的python爬虫,使用beautifulsoup
- Python3 Tkinter基础 Canvas background 创建一个白色的画布 create_line width 画一个宽的线