-
我在 Python 的循环里批量造了一串函数,每个本该记住自己那一轮的编号,结果调用时它们却异口同声地全返回了最后一个数,排查半天发现闭包记住的是变量本身、而不是当时那个值的深度复盘
我有个需求:根据一个列表批量生成一串回调函数,每个被调用时应返回它对应的索引——第 0 个返回 0、第 1 个返回 1。我很自然地在 for 循环里用 lambda 一个个造出来,自觉天衣无缝。可一调用就傻眼:这串函数无论调哪一个,返回的全是同一个数——最后一个索引!它们仿佛集体失忆,谁也没记住自己出生那一刻的编号,而是异口同声报出同一个数。我盯着那段再正常不过的循环百思不得其解:明明每轮 i 都…- 0
- 0
-
我写了个函数给参数设了个空列表默认值,第二次调用时却发现里面莫名其妙带着上一次的数据,我对着 Python 可变默认参数在定义时只创建一次被所有调用共享这个坑排查大半天的复盘
一个堪称 Python 头号经典陷阱的坑,几乎每个 Python 程序员都会栽一次,诡异在出问题的函数每次调用代码一模一样、行为却随调用次数改变,仿佛函数有记忆。写了个给篮子添加物品的函数,为了不传篮子时就新建空篮子,很自然给参数设了 [] 默认值:def add_item(item, basket=[]): basket.append(item); return basket。第一次 add_i…- 0
- 0
-
我给函数参数设了个默认空列表,本以为每次调用都会拿到全新的一个,结果它竟在一次次独立的调用之间,诡异地记住了上一次追加进去的数据的深度复盘
我写了个"往列表追加一项再返回"的函数,图方便给列表参数设了默认值 []。本以为每次不传参都会拿到全新的空列表,结果第一次传 a 返回 [a] 没问题,第二次传 b 竟返回 [a,b]、第三次成了 [a,b,c]——它像有记忆一样,在一次次独立调用间累积了所有旧数据。翻文档看到那条著名警告才懂:Python 默认参数是在函数"定义时"求值一次、创建好的,之后…- 0
- 0
-
第二个用户的购物车里混进了第一个用户的商品:我在 Python 里因为一个 def func(items=[]) 的可变默认参数,踩了个跨用户数据泄露的共享状态大坑
测试同事报告:账号 A 加完商品,账号 B 调同一个接口,购物车里竟带着 A 的商品——跨用户数据泄露。根因是我把默认参数写成了 def add_to_cart(item, cart=[]),而默认值在 def 定义时只创建一次、被所有调用共享。这篇复盘讲清原理、None 哨兵正解,并举一反三到可变类属性、[[0]*n]*m、返回内部引用这一整类共享可变状态的坑。- 0
- 0
-
Python 函数默认参数是 [] 让我们订单串单的 P1 事故复盘
一行 def f(items=[]) 让我们公司订单数据互相串了。本文讲透 Python mutable default argument 的根源、3 个表亲坑(dict / datetime.now / 闭包),以及怎么用 ruff + pre-commit 永久解决。- 0
- 0
默认参数
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!




![第二个用户的购物车里混进了第一个用户的商品:我在 Python 里因为一个 def func(items=[]) 的可变默认参数,踩了个跨用户数据泄露的共享状态大坑](https://blog.biekanle.com/wp-content/uploads/thumb/2026/06/fill_w526_h326_g0_mark_manual_302_cover.webp)
![Python 函数默认参数是 [] 让我们订单串单的 P1 事故复盘](https://blog.biekanle.com/wp-content/uploads/thumb/2026/05/fill_w526_h326_g0_mark_cover-24992-1779158344.webp)