美文网首页
python函数的默认参数请勿定义可变类型

python函数的默认参数请勿定义可变类型

作者: CanCanJ | 来源:发表于2019-08-24 22:58 被阅读0次

python函数的默认参数请勿定义可变类型

经常会看到这样一句代码警告:
Default argument value is mutable
意思是告诉我们函数的定义中,使用可变类型做默认参数。
那为什么会有这个警告呢?

可变类型和不可变类型

可变类型(mutable):列表,字典
不可变类型(unmutable):数字,字符串,元组

定义可变类型会有什么问题?

def fun(a=[]):
    a.append(1)
    print(a)
if __name__ == "__main__":
    fun()
    fun()

>>> [1]
    [1, 1]

可以发现,默认参数定义可变类型之后,在第二次乃至更多次地调用同一个函数时,默认参数仿佛失去了效果。
此时,在需要重复调用同一个函数的场景中,就非常容易导致问题,并且该问题不易察觉。在debug的时候就会表现成明明没有参数传进来,但是函数参数会有值,并且执行了不应该执行的操作。

导致的原因

我的理解:
我们定义的函数本身是一个function的实例化对象,每当我们进行函数的定义时,就是创建了一个function的实例化对象,而默认参数就是其属性。
在没有传入参数,以默认参数形式调用,并且改变了函数对象的属性值时,改变的属性值被保存下来,当第二次调用同一个对象时,属性值已经发生了改变。

type(fun)
>>> function

解决方法

def fun(a=None):
    if a is None:
    a = []
    a.append(1)
    print(a)
if __name__ == "__main__":
    fun()
    fun()
>>> [1]
    [1]

相关文章

  • python函数的默认参数请勿定义可变类型

    python函数的默认参数请勿定义可变类型 经常会看到这样一句代码警告:Default argument valu...

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

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

  • 函数相关

    函数定义 def 定义函数,函数返回值用return; python参数定义顺序必须是:必选参数、默认参数、可变参...

  • 可变参数

    定义默认参数要牢记一点:默认参数必须指向不变对象! 在Python函数中,还可以定义可变参数。顾名思义,可变参数就...

  • python---函数参数

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

  • Python 函数

    调用函数 定义函数 函数的参数必选参数、默认参数、可变参数、关键字参数、命名关键字参数 位置参数 默认参数 可变参...

  • Swift函数

    概览函数定义隐式返回返回元组(实现多值返回)函数参数参数标签默认参数值可变参数输入输出参数函数重载内联函数函数类型...

  • Python的参数

    在Python 中,除了正常定义的参数外,Python 还可以使用默认参数,可变参数,关键字参数,使得函数的灵活度...

  • python知识补充点积累

    1、python的位置参数、默认参数、关键字参数、可变参数区别 位置参数:调用函数时根据函数定义的参数位置来传递参...

  • Kotlin基础语法

    包声明默认导入函数定义关键字fun,参数格式: 参数:类型 可变长参数vararg定义常量和变量var va...

网友评论

      本文标题:python函数的默认参数请勿定义可变类型

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