Python的函数参数问题

先定义一个带默认参数的函数:

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,在结束前,重复下廖老师的一句话:定义默认参数要牢记一点:默认参数必须指向不变对象!

posted @ 2015-07-16 14:03  冲刺的大学狗  阅读(1132)  评论(1编辑  收藏  举报