前两天调个解析函数,def add_item(x, lst=[]): lst.append(x); return lst,第一次调 add_item(1) 出来 [1],挺正常,回头又调一次 add_item(2),它居然给我吐了 [1, 2]。
查了半天才反应过来,Python 的默认参数不是在每次调用时现造的,而是在 def 那一行定义的时候就绑定好了那个对象。[] 是个可变对象,函数体内往里 append,改动就留在原地了,下次调用还是同一个 list,状态就这么悄悄累积下来。list、dict、set 这些都踩这个坑。
正确姿势是用 None 占位,函数体里再初始化:if lst is None: lst = []。或者直接 lst = lst or []。这样每次调用都是干净的空列表,跨调用的状态共享就断掉了。这 bug 最烦的地方是它不报错,只是结果慢慢不对,等发现数据串了已经晚了。