为什么Python 3函数的默认值在多次调用时被覆盖?

2 投票
1 回答
884 浏览
提问于 2025-04-18 14:56

有人能告诉我为什么,当我多次调用这个函数时,L 默认情况下从来不会被设置为空吗?而是后续调用的结果会把 L 的内容加到之前所有调用的结果后面?

这个函数把数据分成每7天一组,从最后一个日期开始([::-1]),计算每7天的平均值,并把结果作为一个值添加到一个列表中。它会忽略不完整的组。

数据的默认值是一个按顺序排列的日期列表。

def separate(data = [i for i in w][::-1],L = []):
    print("separate has been called, data is %s and L is %s" % (data, L))

    if len(data)<7:
        return L

    total = 0
    dates = 0

    for value in data[:7]:
        if w[value] != "None":
            total += float(w[value])
            dates += 1
    L.append(total / dates)

    return separate(data[7:], L)

1 个回答

2

摘自官方文档

默认值只会被计算一次。这在默认值是可变对象时,比如列表、字典或者大多数类的实例,就会产生影响。

[...]

如果你不想让默认值在后续调用中被共享,可以这样写函数:

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

撰写回答