今天又看到新人代码里的经典翻车现场~他写了个函数想给 list 当默认参数,def add_item(x, items=[]): items.append(x); return items,本意是调用方不传就给个空列表。结果第一次 add_item(1) 返回 [1],第二次 add_item(2) 竟然返回 [1,2]。他一脸懵:我就想每次来个干净的空列表啊。
哈哈
这坑挺阴的。python 的默认参数不在每次调用时求值,而是在函数定义那一下就求一次值,这个 list 对象会被所有调用共享。你往里塞东西,下次调用还是同一个对象,状态全留着。吧调试时特别难查,因为代码表面看毫无毛病,跑起来却处处诡异。
正确姿势是用 None 当默认值,函数体内再初始化:def add_item(x, items=None): if items is None: items=[]。或者干脆别拿可变对象当默认值。这玩意儿刚学的时候真容易栽,栽过一次就记一辈子了。