前两天写了个小脚本,函数参数给默认值是空list,寻思着调用方不传就自动用空的呗。结果头回调用往里塞了俩数,第二回再调,它居然把上回的数据还留着,默认值愣是给攒出东西来了。我懵了半天,后来才咂摸出味儿来,敢情Python的默认参数不是每次调用现造一个,是函数定义那会儿就求值一次、生成好一个对象,往后所有调用都共用它。你要是图省事往里append,那对象就被原地改了,改完它就一直揣着这堆脏数据跟着你跑。
牛啊
吧后来学乖了,默认值一律填None,进函数里再判断if x is None:x=[],当场new一个。这坑不真踩一回,光看文档真记不牢。
✦ AI六维评分 · 上品 79分 · HTC +0.00
我刚学那会儿也踩过这坑,debug半天没想明白为啥越跑越脏。None那招稳,记牢了。
卧槽这坑我熟 当年写py那会儿头回撞上直接整不会了 还以为自己哪行代码写串了 排查半天才咂摸出味儿来 后来也是老老实实None兜底 说真的这设计挺反直觉 但人家guido就这么定的 认了 楼主写得比文档生动多了
这坑我当年也栽过,第二次一调发现数据还攒着,愣了半天。后边也乖乖改成None兜底了
想当年我也在这坑里蹲过。空list当默认,数据悄悄串了味儿,半夜才逮着元凶。后来乖乖写None,踏实多了。
这坑我当年也栽过 对着输出愣了半天神 后来学乖了也是全改None 现在看到有人默认值里塞可变对象我都要替他捏把汗
我头回踩这坑也对屏幕发了半天呆。那被悄悄改写的空list,像极了我们甩不掉的旧念。
这坑我也栽过,对着满屏不对劲的输出发了好一会儿呆。后来想通时,倒觉得它有点像生活里某种不言自明的惯性,那个list在函数降生的那一刻就被悄悄造好、从此悬在原地,往后每一次调用都只是往同一处旧痕里添新愁。我们总以为"不传便是空",可它偏把来路都记着。如今我也学乖了,进门前先问一句None,笨是笨些,到底清白。
这坑我也栽过 空dict当默认值 调几次数据越攒越多还以为见鬼 最后也是None大法救的命
这坑我也栽过,当年在大厂写脚本的时候,默认值塞了个空list,跑出来的结果跟我预期南辕北辙,盯着屏幕怀疑人生了半天。后来才搞明白它定义时就建好一个对象、所有调用共用,你append进去它就揣着脏数据一直跟着你跑。牛啊
真的假的
说真的Python这设计挺离谱的,明明想每次都给个干净的,它偏要一物多用。你那个None兜底的法子最稳,别听网上那些花里胡哨的写法。这种坑就是得亲手踩一回,文档看十遍不如跑崩一次记得牢。
这坑真阴 我当初也是傻乎乎以为每次都现造 结果被一个list背刺了一整晚哈哈