您的位置:首页 >Python 3.7+ dict.popitem() 的 LIFO 变化详解
发布于2026-01-26 阅读(0)
扫一扫,手机访问
dict.popitem() 在 Python 3.7+ 默认移除最后插入项,遵循插入顺序(LIFO),修改已有键不改变其位置;last=False 时移除最先插入项(FIFO);空字典仍抛 KeyError。

Python 3.7 起,dict 保证插入顺序,popitem() 的行为也随之明确:它不再随机移除键值对,而是**总是移除最近一次插入(或最后修改)的项**,即 LIFO(后进先出)。这个变化不是可选特性,而是语言规范的一部分——哪怕你没显式调用 update() 或重新赋值,只要字典经历过插入顺序变更,popitem() 就按该顺序响应。
容易误以为字典字面量中靠后的键会被优先 pop,但实际取决于运行时插入顺序。例如:
d = {'a': 1}
d['b'] = 2
d.update({'c': 3})
d['a'] = 99 # 修改已存在 key,不改变插入顺序
print(d.popitem()) # 返回 ('c', 3),不是 ('a', 99)
update() 中新键按传入顺序插入,不影响已有键位置d['a'] = 99)**不会改变其插入位置**,popitem() 仍视其为原始插入点dict(**kw) 构造(如 dict(x=1, y=2)),Python 3.7+ 保证 kw 参数顺序即插入顺序,但这是 CPython 实现细节,不建议依赖Python 3.7+ 为 popitem() 新增了 last 参数,默认为 True。这意味着:
d.popitem() 等价于 d.popitem(last=True) → 移除最后插入项d.popitem(last=False) → 移除**最先插入项**(FIFO),相当于“队首弹出”last 参数仅在 Python 3.7+ 可用;3.6 及更早版本传入会报 TypeErrorlast=False,它也不是按 key 字母序或数值序,而是严格按**首次插入时间**无论 Python 版本如何,popitem() 对空字典的行为始终一致:
KeyError: 'popitem(): dictionary is empty'if d: 或用 try/except 包裹,不能依赖返回值判空真正要注意的是:LIFO 行为只反映插入顺序,不反映“最新修改”。如果你反复更新同一个 key,它的位置不会前移——popitem() 弹出的永远是那个“最后被加进来”的键,而不是“最后被改过”的键。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9