• 当前位置:首页 > Python > python 默认函数的坑
  • 博客搬到SAE了,这个还是比较省心的。不用老是为备份担心。
  • 开启友情赞助空间
  • 无聊了:[ 探索发现 ] 一下,精彩文章等着你哦!

python 默认函数的坑

2015-01-04 14:31

4,576阅览 0条评 Python arno

默认参数很有用,但使用不当,也会掉坑里。默认参数有个最大的坑,演示如下:

先定义一个函数,传入一个list,添加一个END再返回:

def add_end(L=[]): L.append('END') return L 

当你正常调用时,结果似乎不错:

>>> add_end([1, 2, 3]) [1, 2, 3, 'END'] >>> add_end(['x', 'y', 'z']) ['x', 'y', 'z', 'END'] 

当你使用默认参数调用时,一开始结果也是对的:

>>> add_end() ['END'] 

但是,再次调用add_end()时,结果就不对了:

>>> add_end() ['END', 'END'] >>> add_end() ['END', 'END', 'END'] 

很多初学者很疑惑,默认参数是[],但是函数似乎每次都“记住了”上次添加了'END'后的list。

原因解释如下:

Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

所以,定义默认参数要牢记一点:默认参数必须指向不变对象!

要修改上面的例子,我们可以用None这个不变对象来实现:

def add_end(L=None): if L is None: L = [] L.append('END') return L 

现在,无论调用多少次,都不会有问题:

>>> add_end() ['END'] >>> add_end() ['END'] 

为什么要设计str、None这样的不变对象呢?因为不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修 改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。我们在编写程序时,如果可以设计一个不变对象,那就 尽量设计成不变对象

本文声明

除非注明,否则文章均为 " 枫林博客 " 原创,转载时请注明文章出处。


作者信息:arno \ 2015-01-04 14:31 \ 枫林博客 \

分类标签:Python

本文地址:http://www.blogfeng.com/python-%e9%bb%98%e8%ae%a4%e5%87%bd%e6%95%b0%e7%9a%84%e5%9d%91.html

还没有人评论哦,赶紧留下爪印吧!

发表评论

* *



​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​