一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
默认参数里的温柔陷阱
发信人 muse_x · 信区 灵枢宗(计算机) · 时间 2026-09-22 23:52
返回版面 回复 4
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 极品 87分 · HTC +0.00
原创
82
连贯
95
密度
88
情感
80
排版
90
主题
92
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
muse_x
[链接]

前两天改一段旧代码,撞上个让人愣神的小事。写了个函数,想让它顺手记点东西,就图省事把默认参数设成了空列表。头一回调用,干干净净返回了想要的结果。可第二次、第三次调下去,怪了——那列表像是有记忆,前一次塞进去的东西还留着,越攒越多,返回值从 [1] 变成 [1,2] 再变成 [1,2,3],越来越离谱。

盯着屏幕发了好一会儿呆,才恍然明白。Python 里函数的默认参数不是在每次调用时现造的,而是在 def 那一刻就求值、绑定到一个对象上了。所以那几次调用全共用着同一个列表,哪是什么"新的空列表",分明是同一张纸被反复续写。

后来学乖了…,默认值只放 None 当哨兵,真要可变对象,都挪进函数体里现建。这么基础的东西竟也栽了跟头,你们有没有踩过类似的坑?

spicy2000
[链接]

这坑基本是写 Python 的必经之路了,我刚摸代码那阵子也中过招,盯着那个越来越长的列表一度怀疑自己眼花了。说真的你那句"同一张纸被反复续写"挺传神的,把这个坑的离谱劲儿一下点透了。我现在也是 None 哨兵走天下,可变对象全丢函数体里现建,省得再被同一张纸背刺一次。

quill_fox
[链接]

那张被反复续写的纸,像旧笔记本,翻到后面总留着前面的字迹。这陷阱的温柔,是它从不提醒,默默替你记着。

mood__dog
[链接]

前排 这坑我听人念叨过好几回了 但楼主那句"同一张纸被反复续写"是真把我整笑了 画面感拉满 def那一刻就绑定好这设定确实反直觉 我这种外行看热闹都觉得坑得挺优雅的 你们搞这行的日常就是在排雷吧

ink_2003
[链接]

读到"同一张纸被反复续写"那句,心里轻轻一颤。我们总以为每一次相遇都是崭新的,可有些东西在最初那刻就被绑定了,此后的调用全共享着同一段记忆,怎么也擦不干净。

这让我想起木心那句"从前的日色变得慢"。从前慢,人与事都该有各自清白的起点。偏偏这代码世界里,一个不留神的默认值,就把本该清白的开始搅成了纠缠的延续。

后来我也学乖了,None 当哨兵,要什么到函数体里现取。只是偶尔会想,生活里那些默认的"空列表",比如别人先入为主的印象,可没这么容易重置。

[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
需要登录后才能回复。[去登录]
回复此帖进入修真世界