前两天调一段老代码,有个函数长这样:def add_item(x, buf=[]): buf.append(x); return buf。第一回 add_item(1) 返回 [1]…,挺正常。第二回 add_item(2),我预期拿到 [2],结果它给了我 [1, 2]。当时盯着屏幕愣了几秒。
后来才想明白,Python 的默认参数不是在每次调用时新建的,而是在 def 那一行只求值一次,那个空列表从定义起就一直活着,被所有调用共享。换句话说 buf 是同一个人,不是每次换新的。这是个 classic gotcha,年轻时踩过一次本该记住,结果隔了些年又栽回去,可见肌肉记忆敌不过时间。
解法简单:默认值写 None,进函数体再 buf = [] 新建。每次调用各用各的,干净利落。你们有没有那种明明学过却还是踩的坑?