python中形参默认参数为可变对象时!规则变动

如:

def f(a, L=[]):
    L.append(a)
    return L


print(f(1))  # [1]
print(f(2))  # [1, 2]
print(f(3))  # [1, 2, 3]

在这个函数中,参数 L 的默认值是一个空的列表 []。当该函数被调用时,如果没有为 L 提供参数值,则默认值 [] 会被使用。然而,由于默认参数的值只在函数定义时被计算一次,因此在每次调用函数时,使用的都是同一个列表对象。这意味着对默认参数进行修改会影响到所有的函数调用。

在这个例子中,当函数 f 第一次被调用时,L 被赋值为 [],然后 a 被添加到 L 中并返回。第二次调用 f 时,默认参数 L 的值不是空列表,而是第一次调用后修改后的列表 [1]。因此,2 被添加到 L 中,并返回 [1, 2]。在第三次调用中,L 的默认值仍然是 [1, 2],并添加了 3,因此返回值为 [1, 2, 3]。

因此,这个函数在多次调用时会累积列表的值,而不是每次都返回一个新的列表。如果需要每次调用函数时都创建一个新的空列表作为默认值,可以将函数定义改为:

def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

这个版本的函数会在每次调用时检查 L 是否为 None,如果是,则创建一个新的空列表。这样就可以避免默认参数值被修改而导致问题。

posted @ 2023-05-14 23:31  __username  阅读(36)  评论(0编辑  收藏  举报

本文作者:DIVMonster

本文链接:https://www.cnblogs.com/guangzan/p/12886111.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。