美文网首页
当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中函数可选参数遇上可变变量时形成的坑

    从上一篇文章记python中函数调用方不按顺序提供部分默认参数的功能以及和php的不同中可以看到,python对函...

  • python notes 1

    python 笔记 列表的一些问题 列表是可变对象,字符串为不可变对象。 当列表作为函数的参数时,函数定义中的形参...

  • Python函数的参数(详细版)

    函数的参数有:必选参数、默认参数、可变参数、关键字参数。 在Python中定义函数,可以用必选参数、默认参数、可变...

  • 函数的参数传递

    1.可选参数和可变数量参数 可选参数定义:某些函数在定义参数时就为一些参数设置默认值,在调用函数时可以不用为这些参...

  • Python实战:函数

    Python中函数的声明格式: 例如: 函数的调用: 关于位置参数、关键字参数、可变参数和不可变参数 位置参数:参...

  • Python参数 * 与 ** ,及装包拆包

    (*args)可变参数在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以...

  • python-----函数参数相关

    Python中函数参数是引用传递(注意不是值传递)。对于不可变类型,因变量不能修改,所以运算不会影响到变量自身;而...

  • python---函数参数

    python---函数参数 在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参...

  • 第5天-python基础-函数与模块

    定义函数 Python中每个函数都有自己的名字、自变量和因变量。我们通常把Python中函数的自变量称为函数的参数...

  • Python开发人员犯下的10个最常见的错误

    1 滥用表达式作为函数参数的默认值 python允许通过为函数提供默认值来指定函数参数的,但是当默认值是可变的时,...

网友评论

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

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