想当年刚摸Python的时候,写了个给列表去重的小函数,顺手把默认参数填了个空列表。头两回跑得挺正常,后来越调越不对劲——明明每次都没传参数进去,它却把前几次的结果都攒到一块儿了。
我盯着屏幕愣了好一阵才咂摸出味儿来。那默认参数不是每次调用现生成一个,是函数定义那会儿就钉死的一个老对象,你往里塞一次它就记一笔,下次还接着用。
这坑不深,可最磨人就在它看着平平无奇。后来带的新人也栽过,倒也不怪谁。你们还遇见过什么这种"不起眼却邪门"的坑没。
想当年刚摸Python的时候,写了个给列表去重的小函数,顺手把默认参数填了个空列表。头两回跑得挺正常,后来越调越不对劲——明明每次都没传参数进去,它却把前几次的结果都攒到一块儿了。
我盯着屏幕愣了好一阵才咂摸出味儿来。那默认参数不是每次调用现生成一个,是函数定义那会儿就钉死的一个老对象,你往里塞一次它就记一笔,下次还接着用。
这坑不深,可最磨人就在它看着平平无奇。后来带的新人也栽过,倒也不怪谁。你们还遇见过什么这种"不起眼却邪门"的坑没。
这个坑我刚学那会儿也踩过,盯着输出半天没想明白。后来每次都改成传 None 再判空,踏实多了。
这默认参数跟记仇似的 我早年写小玩意儿也翻过车 服了
我刚摸Python那阵子也在这同一个地方绊过跤,当时怎么想都想不通,明明没给参数它怎么还把上回的东西留着,对着屏幕发了好半天愣才慢慢明白过来。嗯嗯是呢,这个坑最磨人的就是你说的,它一点也不凶,代码看着干干净净,偏偏悄悄给你攒旧账,越想越觉得邪门。
加油呀我也撞见过一个差不多的,就是浮点数那个,0.1 + 0.2 算出来不是 0.3,是 0.30000000000000004。第一回看见真的愣住,后来才懂是二进制存不干净。这种坑都不深,但撞上的时候特别容易怀疑自己哪里写错了。
你们后面还碰见什么离谱的也来讲讲呀,大家互相提个醒就好,화이팅。
当年我也干过一模一样的事,图省事给函数塞了个空列表当默认参数,前几回跑得欢,后来数据越攒越像滚雪球,我还以为是接口那边抽风,对着日志盯了半天。说真的,这种坑最损的地方就是它长得太老实,你压根不会往那想。
我后来还撞过更邪门的,循环里套 lambda,循环变量被最后一轮整个吞掉,打印出来全是同一个数。那会儿真想给解释器写封信问问它脑子里在想啥。你们说的这些不起眼却邪门的坑,凑一凑都够出本错题集了。
这函数还挺记仇,你往里塞啥它都偷偷攒着,等秋后算账呢哈哈
函数定义那会儿就钉死的老对象,这形容太形象了。最磨人的就是它不报错,闷声记旧账。稳,这帖我顶了!
默认参数比前任还记旧账 我也踩过 现在一律None兜底
这坑我早年也踩过,对着输出愣神半天 打那以后看见默认列表参数就条件反射写None了哈哈
默认参数这老哥也太记仇了 明明没惹它每次还把前几笔旧账翻出来 我虽然不搞这行但看得莫名解气 你们天天跟这种闷声坑打交道不累吗哈哈