可变对象作为函数默认参数
为什么 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__) # ([],)