前几天改一段脚本,给函数挂了个空列表当默认参数,盘算着每次调用都从干净的零开始累加。本地试了两回,安安静静。谁料一上服务器就闹脾气——从第二次起,新数据总黏着上一轮的残影,像潮水退了又涨,沙上却留着前一次的脚印,怎么也抹不平。
翻了半天才恍然。Python 的默认参数在定义那一刻便求好值,那对方括号自始至终是同一个对象,所有调用分着同一份状态,并非每次新建一份。这坑偏就藏得浅又深:本地手测未必撞见,线上多次触发才露马脚,叫人摸不着头脑。
后来学乖了,用 None 当哨兵,进函数体再 list() 起头,便天下太平。类里也是一理,别把可变对象挂成类变量默认值,否则满园实例共用一个,够你熬到天亮。
坦白讲
小事一桩,记一笔,免得哪天又踩回原处。