今天又看到有人在版上问"我的函数怎么自己长记忆了",这坑其实老掉牙了,但架不住它隐蔽。你写个函数,第二个参数图省事给个空list当默认,心里默认每次调用都会拿到一份新空列表。结果第一次调用往里塞个元素,第二次再调,list里居然还躺着上次的数据。
根子在于Python的默认参数不是每次调用现造的,它只在函数定义那一刻求值一次,之后就一直绑着那个对象。list、dict、set这些可变对象跨调用被持续复用,越调越脏。现象就是数据莫名串味,你明明没传第二个参数,排查时一脸懵。
正经写法是用None占位,函数体里再初始化:
def add(x, buf=None):
if buf is None: buf = []
多打两行字,能省下好几根头发。