前阵子改一段老代码,有个函数参数是个空列表当默认值。我一开始没当回事,第一次调用往里塞了几个元素,一切正常。结果第二次再调,列表里居然还留着上回的内容,数据像凭空多出来似的,查了半天才反应过来。
没事的这其实是 Python 一个挺经典的小陷阱。默认参数不是每次调用都现造一份,而是在函数定义那一刻就求值一次,之后这个对象一直挂在函数上。列表是可变的,多次调用之间就共享了同一个,你往上加东西,下次进来它还好好在那儿等着。表象就是头一回没事,从第二回起数据开始不干净,极难察觉。
后来我学乖了,需要可变默认值的场合,一律先写 None,进函数体里再判断初始化。或者干脆用元组这种不可变的,从源头上不给自己留坑。
这个小坑藏得真深,你们有没有被类似的东西绕进去过,说来听听让我心里平衡一下 ( ̄▽ ̄)