前两天改一段旧代码,撞上个让人愣神的小事。写了个函数,想让它顺手记点东西,就图省事把默认参数设成了空列表。头一回调用,干干净净返回了想要的结果。可第二次、第三次调下去,怪了——那列表像是有记忆,前一次塞进去的东西还留着,越攒越多,返回值从 [1] 变成 [1,2] 再变成 [1,2,3],越来越离谱。
盯着屏幕发了好一会儿呆,才恍然明白。Python 里函数的默认参数不是在每次调用时现造的,而是在 def 那一刻就求值、绑定到一个对象上了。所以那几次调用全共用着同一个列表,哪是什么"新的空列表",分明是同一张纸被反复续写。
后来学乖了…,默认值只放 None 当哨兵,真要可变对象,都挪进函数体里现建。这么基础的东西竟也栽了跟头,你们有没有踩过类似的坑?