dict.popitem() 在 Python 3.7+ 的 LIFO 行为变化细节

发布时间 - 2026-01-26 00:00:00    点击率:
dict.popitem() 在 Python 3.7+ 默认移除最后插入项,遵循插入顺序(LIFO),修改已有键不改变其位置;last=False 时移除最先插入项(FIFO);空字典仍抛 KeyError。

dict.popitem() 在 Python 3.7+ 默认移除最后插入项

Python 3.7 起,dict 保证插入顺序,popitem() 的行为也随之明确:它不再随机移除键值对,而是**总是移除最近一次插入(或最后修改)的项**,即 LIFO(后进先出)。这个变化不是可选特性,而是语言规范的一部分——哪怕你没显式调用 update() 或重新赋值,只要字典经历过插入顺序变更,popitem() 就按该顺序响应。

popitem() 不受 key 排序或字面量书写顺序影响

容易误以为字典字面量中靠后的键会被优先 pop,但实际取决于运行时插入顺序。例如:

d = {'a': 1}
d['b'] = 2
d.update({'c': 3})
d['a'] = 99  # 修改已存在 key,不改变插入顺序
print(d.popitem())  # 返回 ('c', 3),不是 ('a', 99)
  • update() 中新键按传入顺序插入,不影响已有键位置
  • 对已有 key 赋值(如 d['a'] = 99)**不会改变其插入位置**,popitem() 仍视其为原始插入点
  • 如果用 dict(**kw) 构造(如 dict(x=1, y=2)),Python 3.7+ 保证 kw 参数顺序即插入顺序,但这是 CPython 实现细节,不建议依赖

popitem(last=True) 是默认行为,last=False 才是反向

Python 3.7+ 为 popitem() 新增了 last 参数,默认为 True。这意味着:

  • d.popitem() 等价于 d.popitem(last=True) → 移除最后插入项
  • d.popitem(last=False) → 移除**最先插入项**(FIFO),相当于“队首弹出”
  • last 参数仅在 Python 3.7+ 可用;3.6 及更早版本传入会报 TypeError
  • 注意:即使 last=False,它也不是按 key 字母序或数值序,而是严格按**首次插入时间**

空 dict 调用 popitem() 仍抛 KeyError

无论 Python 版本如何,popitem() 对空字典的行为始终一致:

  • 触发 KeyError: 'popitem(): dictionary is empty'
  • 不因 LIFO 特性而改变异常类型或消息
  • 若逻辑中可能遇到空字典,必须显式检查 if d: 或用 try/except 包裹,不能依赖返回值判空
  • 这个异常信息里的引号是原样输出的,注意匹配时需包含单引号和空格

真正要注意的是:LIFO 行为只反映插入顺序,不反映“最新修改”。如果你反复更新同一

个 key,它的位置不会前移——popitem() 弹出的永远是那个“最后被加进来”的键,而不是“最后被改过”的键。


# python  # 键值对 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Mybatis 中的insertOrUpdate操作  如何快速搭建FTP站点实现文件共享?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  Swift中循环语句中的转移语句 break 和 continue  教学论文网站制作软件有哪些,写论文用什么软件 ?  网站优化排名时,需要考虑哪些问题呢?  移动端脚本框架Hammer.js  如何在自有机房高效搭建专业网站?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  开心动漫网站制作软件下载,十分开心动画为何停播?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  如何自定义建站之星网站的导航菜单样式?  如何挑选最适合建站的高性能VPS主机?  Java遍历集合的三种方式  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  jQuery 常见小例汇总  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  js实现点击每个li节点,都弹出其文本值及修改  免费网站制作appp,免费制作app哪个平台好?  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  在线制作视频的网站有哪些,电脑如何制作视频短片?  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  如何快速搭建高效香港服务器网站?  如何在不使用负向后查找的情况下匹配特定条件前的换行符  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何快速搭建支持数据库操作的智能建站平台?  Android利用动画实现背景逐渐变暗  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  轻松掌握MySQL函数中的last_insert_id()  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  如何快速搭建虚拟主机网站?新手必看指南  JavaScript中的标签模板是什么_它如何扩展字符串功能  浅谈javascript alert和confirm的美化  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  Laravel如何实现文件上传和存储?(本地与S3配置)  如何在搬瓦工VPS快速搭建网站?  如何选择PHP开源工具快速搭建网站?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  智能起名网站制作软件有哪些,制作logo的软件?