CodeWalk

可变对象作为函数默认参数

作者:孤独的心 · 2026-05-30 12:55

为什么 Python 中不建议使用可变对象(如列表、字典)作为函数的默认参数?请解释原因并给出正确做法。

回答

孤独的心

函数的默认参数在定义时创建一次,之后所有调用共享同一对象。

# 问题代码
def add_item(item, lst=[]):
    lst.append(item)
    return lst

print(add_item(1))  # [1]
print(add_item(2))  # [1, 2]  <- 不是期望的结果!

正确做法

def add_item(item, lst=None):
    if lst is None:
        lst = []
    lst.append(item)
    return lst

原理:函数是对象,__defaults__ 属性在定义时创建。

print(add_item.__defaults__)  # ([],)