Python中如何理解函数的默认参数问题?

现在有一个函数 func,有两个参数 x,y,其中 x 是必选参数,y 是可选参数

我的想法是:当参数 y 没有传入值的时候,参数 y 的值默认等于参数 x 的值

有点类似于:

def add(x,y=x):
    pass

但是这么写肯定是不对的

所以应当怎么实现我的想法呢?


Python中如何理解函数的默认参数问题?
10 回复

在函数内判断 Y 是否 None,再赋值是否可行?


在Python里,函数的默认参数是个挺有意思的特性,但有个常见的坑:默认参数的值只在函数定义时被创建一次,而不是每次调用时都重新创建。

看这个经典例子:

def append_to_list(value, my_list=[]):
    my_list.append(value)
    return my_list

print(append_to_list(1))  # 输出 [1]
print(append_to_list(2))  # 输出 [1, 2] 而不是预期的 [2]

问题出在my_list=[]这个默认参数上。这个空列表在函数定义时就被创建了,之后每次调用函数(如果没有显式传入列表参数)都会使用同一个列表对象。

正确的做法是用None作为默认值,然后在函数内部创建可变对象:

def append_to_list(value, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(value)
    return my_list

print(append_to_list(1))  # 输出 [1]
print(append_to_list(2))  # 输出 [2]

对于不可变对象(如数字、字符串、元组)作为默认参数时,这个特性通常不会造成问题,因为不可变对象的值不会被修改。但对于列表、字典、集合这类可变对象,就需要特别注意了。

简单说就是:默认参数用None,内部判断再创建。

def add(x, y=None):
if not y:
y = x

return x + y

不求优雅的话,函数内自己判断和赋值吧




我考虑过这种情况,但是如果我指定 x 不为 None,同时 y 为 None,这么写就会有问题

那在加上判断为 0 的情况呗

不是 is None 么 233

<br>missing = object()<br>def add(x, y=missing):<br> if y is missing:<br> y = x<br>

不知道这样可以不


def f(x, *arg):
if len(arg) == 0:
y = x
f(x,y)
elif len(arg) == 1:
y = arg[0]
pass

我觉得你这个是正解了,谢谢

回到顶部