当python中函数可选参数遇上可变变量时形成的坑

2017-12-15  本文已影响0人  舒小贱

从上一篇文章记python中函数调用方不按顺序提供部分默认参数的功能以及和php的不同中可以看到,python对函数可选参数的处理相当灵活,给调用者带来了极大的方便。但是这篇文章就要讲当函数可选参数遇上可选变量时,给函数调用方造成的麻烦。演示如下:
先定义一个函数,有一个可选参数,且默认值是list类型的可变变量:

def add_end(l=[]):
    l.append('end')
    return l

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

运行结果:

E:\python_study>python 1.py
[1, 2, 3, 'end']
['x', 'y', 'z', 'end']
['end']
['end', 'end'] ####emmmm
['end', 'end', 'end'] ####emmmm...

当前两次调用时传入了可选参数,结果符合预期。第三次调用时没传可选参数,看起来也符合预期,但是当第四次和第五次又没传可选参数调用时,结果就不符合预期了,为啥append了那么多end。。。函数似乎每次都“记住了”上次添加了'END'后的list

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

定义默认参数要牢记一点:可选参数的默认值必须指向不变对象!

参考:
函数的参数

上一篇 下一篇

猜你喜欢

热点阅读