美文网首页
当python中函数可选参数遇上可变变量时形成的坑

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

作者: 舒小贱 | 来源:发表于2017-12-15 19:17 被阅读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的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

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

    参考:
    函数的参数

    相关文章

      网友评论

          本文标题:当python中函数可选参数遇上可变变量时形成的坑

          本文链接:https://www.haomeiwen.com/subject/negdwxtx.html