如何在Python函数中使用和注意默认参数

商业

在Python函数定义中设置一个缺省参数,如果在函数调用过程中遗漏了这个参数,就会使用缺省值。

下文将详细介绍。

  • 设置默认参数
  • 对默认参数位置的限制
  • 请注意,当一个列表或字典被用作默认值时

设置默认参数

如果函数定义中的参数名=默认值,那么当相应的参数被省略时将使用默认值。

def func_default(arg1, arg2='default_x', arg3='default_y'):
    print(arg1)
    print(arg2)
    print(arg3)

func_default('a')
# a
# default_x
# default_y

func_default('a', 'b')
# a
# b
# default_y

func_default('a', arg3='c')
# a
# default_x
# c

对默认参数位置的限制

当定义一个函数时,将默认参数放在正常参数(没有指定默认值的参数)之前,会导致一个错误。
SyntaxError

# def func_default_error(arg2='default_a', arg3='default_b', arg1):
#     print(arg1)
#     print(arg2)

# SyntaxError: non-default argument follows default argument

请注意,当一个列表或字典被用作默认值时

如果一个可更新(可变)的对象,如列表或字典被指定为默认值,那么当函数被定义时,该对象将被创建。然后,当函数被调用而没有相应的参数时,就会使用同一个对象。

默认参数值在执行函数定义时从左到右进行评估。这意味着默认参数表达式在定义函数时只被评估一次,而且每次调用都使用相同的 “计算 “值。
8.7. Function definitions — Python 3.10.2 Documentation

因此,例如,如果定义了一个以列表或字典为默认参数并向其添加元素的函数,并且在没有该参数的情况下多次调用,元素将被重复添加到同一个对象中。

列举一个例子。

def func_default_list(l=[0, 1, 2], v=3):
    l.append(v)
    print(l)

func_default_list([0, 0, 0], 100)
# [0, 0, 0, 100]

func_default_list()
# [0, 1, 2, 3]

func_default_list()
# [0, 1, 2, 3, 3]

func_default_list()
# [0, 1, 2, 3, 3, 3]

词典的例子。

def func_default_dict(d={'default': 0}, k='new', v=100):
    d[k] = v
    print(d)

func_default_dict()
# {'default': 0, 'new': 100}

func_default_dict(k='new2', v=200)
# {'default': 0, 'new': 100, 'new2': 200}

每次调用函数时都会创建一个新的对象。

def func_default_list_none(l=None, v=3):
    if l is None:
        l = [0, 1, 2]
    l.append(v)
    print(l)

func_default_list_none()
# [0, 1, 2, 3]

func_default_list_none()
# [0, 1, 2, 3]