标签:
先定义一个带默认参数的函数:
def add_end(L=[]): L.append(‘END‘) return L
使用下面的代码调用该函数:
print(add_end([1,2,3])) print(add_end()) print(add_end([1,2,3])) print(add_end())
结果:
为什么第四行输出会是这样呢?看了廖雪峰老师的教程后,对此问题的理解为:
在定义完函数后,参数L的值就被计算出来了,并成为了一个类似于“全局变量”的东西,也就是说,一次调用函数完了之后,这个变量不会被回收,当继续以无参的形式调用该函数时,L指向的将继续是原本的那个list空间。以上面的例子说明。第一行,把L指向一个list[1,2,3],运行没问题。第二行,没有传入参数,使用默认参数,L指向一开始就准备好了的空的list[],运行没问题。第三行,和第一行一样。第四行,没有传入参数,L指向一开始就准备好了的list,这时候的list因为第二行的改变已经从[]变成了[‘END‘],所以运行的结果是[‘END‘,‘END‘]。
那么,该怎么修改呢?下面给出廖老师的修改方法:
def add_end(L=None): if L is None: L = [] L.append(‘END‘) return L
上面的代码中,当使用默认参数(没有传参进来的时候)时,L被赋予一个list,注意,这个list是临时的,即他的生命周期就是一次函数的调用周期,当函数被调用结束时,他会被回收,不会对下次的调用产生影响,这也是和上面的有问题的代码中的全局的list的差别所在。
ok,在结束前,重复下廖老师的一句话:定义默认参数要牢记一点:默认参数必须指向不变对象!
标签:
原文地址:http://www.cnblogs.com/yns-blogs/p/4651153.html