Python字典为什么有序?3.7插入顺序保证背后的哈希表实现与工程取舍
Python 3.6 刚发布那会儿我把项目解释器版本从 3.5 升上来第一件让我愣住的事不是 f-string也不是 async/await 的完善而是普通字典的打印顺序突然变了。以前每次跑 dict 输出出来的顺序都像抽奖那次却和赋值的先后顺序完全一致。我当时还以为是环境巧合后来翻 release notes 才发现是字典内部的哈希表实现被重写了而“保存插入顺序”只是这次重写的副产品。这也就是社区里常说的“意外之喜”。等到 Python 3.7 发布官方直接把这项保证写进了语言规范字典有序从“一个解释器碰巧做到的实现细节”正式变成“所有 Python 实现都必须遵守的承诺”。这篇内容适合所有正在用 Python 3.7 的人特别是维护老项目、做数据接口、写配置系统的开发者——我尽量把原理、坑和取舍一次讲清楚。1. 无序时代字典为什么天生不排序1.1 哈希表的工作方式顺序从来不是设计目标想要理解 3.6/3.7 的变化得先回到无序时代的字典实现。Python 的 dict 本质是一个哈希表调用一个散列函数把 key 转成一个整数再用这个整数计算在一块连续内存里的位置。查找时也是同样的路径所以平均复杂度是 O(1)。问题在于哈希值的分布和插入顺序没有任何关系一个 key 会落在哪个槽位取决于它自己的哈希值以及当时哈希表的容量、掩码和它前面后面插入的 key 都无关。长期接触过这类实现的开发者应该都清楚这个结构和“排序”完全是两回事。它甚至不是真的“随机”而是“依赖哈希值排列”。你用不同的 key、不同的 Python 版本、不同的环境变量最终打印出来的顺序都不一样。尤其是 Python 的字符串哈希为了防哈希冲突攻击默认会加随机盐同一份代码跑两次进程间顺序都可能不同。有人用生活类比问过我我不太喜欢“抽屉”那个说法更喜欢图书馆类比哈希函数是按编号给每本书分配书架位置你抱着几本书按任意顺序来它们最终都只按编号落位和你进馆的顺序无关。所以老 Python 的“无序”不是文档里随便写的而是哈希表模型带来的天然产物。1.2 无序带来的实际痛点调试、日志、序列化与测试在 3.6 之前普通 dict 的无序性给日常开发造成了很大的隐性成本。最直接的感受是调试输出不稳定你写个服务往 logger 里丢一个 dict半小时后去看日志key 顺序和你代码里赋值的顺序大概率对不上。如果这个 dict 还被外层框架做了 repr、JSON 序列化那 diff 工具基本没法看查问题的第一屏全在和无序顺序做斗争。另一个很容易踩的场景是 API 参数。在 3.5 时代假如你要把多个来源拼成一个签名参数或者把用户传入的字段原样透传普通 dict 根本无法保证结果顺序你只能借助collections.OrderedDict而且不是所有人都记得这项工作。更麻烦的是测试断言某些人会写出“期望顺序”的测试用例结果在本地通过、CI 上失败因为哈希随机化让顺序变了。包括很多第三方库内部用 dict 暂存配置项打印和读写顺序在不同环境不一致。今天回过头看这些痛点你能理解为什么一个“实现细节”会让那么多人兴奋不是列表变得有序那么直接而是大量原本需要绕行的代码突然都可以简单化了。2. 3.6 的“意外之喜”compact dict 改了什么2.1 旧实现为什么浪费内存Python 3.5 及更早版本的 dict内部是一整块稀疏数组。每个槽位正常情况下存放 hash、key、value没有元素的位置留空删除过的位置不能立刻恢复成“空”为了让开放寻址的探测链不断掉必须打上一个叫“dummy”的特殊标记。这意味着字典容量是按哈希表大小定的不是按实际存在的 key 个数定的。比如你有三个元素但表容量是八数组里照样会有八个槽位其中一部分被 dummy 占着。更不要说扩容时要把整张表复制一遍内存和 CPU 都有浪费。这个设计在 2000 前后的硬件、业务体量下没什么大问题但在今天动辄几十万条配置、海量中间缓存的场景里内存开销就显得很扎眼。早期的优化努力里有人想过用更紧凑的存储、有人想过少复制但真正动刀重写的方案改变的是整个内部布局。2.2 indices entries紧凑哈希表怎么做到保留插入顺序CPython 在 3.6 里引入了所谓的 compact dict核心思想是把原来一张稀疏表拆成两层。第一层叫indices它才是真正的哈希表长度和表容量一致每个槽位里存的是一个整数下标空位用-1表示。第二层叫entries是一个紧凑数组按 key 插入的顺序往尾部追加每个条目里保存三项hash、key、value。查找 key 时先对 key 算哈希再去indices里定位下标最后到entries里取真正的数据。插入新 key 时直接往entries的末尾追加一条记录同时在indices里记下它的位置。因为entries天然就是“按插入时间排列”的列表所以遍历字典时直接从 0 号条目扫到最后一个条目打印顺序、迭代顺序就成了插入顺序。为什么省内存因为entries没有空洞不会因为表容量而预留一堆空槽位indices虽然仍然是稀疏的但它只存整数下标而且 CPython 会根据表容量自适应选择 1/2/4/8 字节来存储代价比存整组 hash/key/value 小得多。官方在 3.6 的 What’s New 里提到新实现让字典内存占用在常见场景下降了很多我当时实测的感觉和数据都落在 20% 到 25% 这一档不同负载下会有浮动。这么一改还有个额外好处缓存局部性。遍历entries时它是一段连续紧凑的内存CPU 命中率比跳着访问稀疏表好所以在很多场景下性能不降反升。换句话说“有序”本身不是这次重写的目标而是重写的副产品——就像你重新装修房间顺便发现动线变顺了。提示不要把“紧凑”理解为“小字典一定更快”。事实上小字典的 overhead 在大改后未必有太大变化真正的收益主要体现在中等以上的数据量场景。2.3 3.6 时代官方态度这仍然只是实现细节虽然 3.6 的 CPython 已经表现得“有序”但官方在那个阶段的措辞是非常谨慎的语言文档和 What’s New 里明确写字典保留插入顺序是这个新实现的 implementation detail并不是所有 Python 实现都必须遵守的保证。为什么这么谨慎因为 CPython 只是 Python 的一个实现还有 PyPy、Jython 等语言规范的每句话都会变成它们必须兼容的契约。如果 3.6 直接宣称“字典有序”其他实现来不及跟进会被活活坑掉。所以你在 3.6 时代看到很多经验帖会说“可以用但别写到 API 文档里”。我自己当时的心态也是暂时用起来当作优化福利但如果要写长期兼容的库还是会用 OrderedDict 兜底。因为 3.6 的这一版行为理论上在下个版本有被改掉的可能。好在官方随后听到了社区的强烈反馈决定把这个行为转正。3. 3.7 的官方承诺从 CPython 特性到语言规范3.1 语言规范怎么落地Python 3.7 发布时最值得写进软件工程教科书的变化之一就是它明确宣布字典的顺序保证是语言的一部分。官方文档的版本变更说明里直接写了类似“字典顺序保证为插入顺序”的话并且把这一点放在了语言参考里而不是某个实现说明里。从那一刻开始这个保证就不是 CPython 自己的行为而是所有标称支持 Python 3.7 的解释器都必须遵守的规范。这件事在编程语言里并不常见。绝大多数实现优化即使很成功也不会贸然升级为语言特性因为一旦成为规范未来就没有回头路。但字典有序的建议获得了压倒性的社区支持最终官方也认为这个副作用对开发者利大于弊所以拍板转正。自此你可以放心地在代码注释、接口文档、单元测试中使用“字典按插入顺序”这个假设。3.2 配套变化PEP 468 与函数关键字参数顺序这里要提到另一个容易被混淆的兄弟PEP 468。它虽然也出现在 3.6但解决的问题是函数签名层面的顺序保留。在没有 PEP 468 的版本里函数定义成def f(**kwargs)后就算调用方按顺序传了a1, b2函数体里拿到 kwargs 后的具体顺序也不保证。对一些需要按调用顺序拼 SQL、拼日志、做前置校验的场景这是非常头疼的事。PEP 468 保证了函数收到的**kwargs顺序和调用方传入顺序一致。它表面上看是“关键字参数顺序”的改进实际上也依赖了字典底层可以保留插入顺序这一基础。这个设计单独成文的意义在于它把顺序和函数接口绑定在一起而不是只停留在数据结构内部。到 3.7 之后dict 有序与 kwargs 有序这两个承诺叠加很多框架级的功能才成为可能。比如 3.7 同期发布的 dataclass字段定义顺序可以自然反映到__dict__里这也是建立在 dict 有序基础上的典型受益者。注意**kwargs的顺序承诺只在函数内部可见。如果你把 kwargs 传给另一个普通字典或者把参数再透传顺序依然是“碰巧保持”只是不保证所有边界都如你所愿。核心原则是靠接口的显式传递而不是玄学。3.3 主流实现跟进情况语言规范一旦定下其他实现就得跟上。像 PyPy 这样的替代解释器在和 CPython 对齐 3.7 语言特性时也把字典实现调整成了能保证插入顺序的版本。虽然它们底层的数据结构未必和 CPython 的 compact dict 一样但外部行为必须一致。对于普通开发者来说这个“跟进”没有太多感知因为大部分人在生产环境跑的就是 CPython。但它的意义在于如果你有跨解释器运行的代码、或者在嵌入式环境里用某个 Python 子集写“字典有序”的逻辑也能获得规范层面的支持。当然大家也不会因此放松警惕——毕竟语言规范和实现成熟的差一个版本周期3.7 初期某些小众实现可能仍然有兼容问题。我的经验是多看 CI 测试矩阵而不是只看文档。4. 有序字典实战行为细节、坑点和与 OrderedDict 的取舍4.1 插入、更新、删除到底怎么影响顺序先看一段行为测试这是 3.7 下普通 dict 的规则d {} d[a] 1 d[b] 2 d[c] 3 # 更新已有 key不会改变位置 d[b] 20 print(d) # {a: 1, b: 20, c: 3} # 删除一个 key del d[a] print(d) # {b: 20, c: 3} # 删除后再插入同名 key等价于新 key会被加到末尾 d[a] 100 print(d) # {b: 20, c: 3, a: 100}重点更新值不改变顺序删除后再重插会跑到末尾因为它等于重新插入一个 key。官方语言文档后来甚至明确写进了这条规则。很多人在做缓存、做去重、做“最近访问”逻辑时都因为这条规则踩过坑你想维护一个 FIFO 队列以为用普通 dict 就行结果删除重建后元素顺序全乱了。更常见的是用普通 dict 模拟 LRU光靠删掉再重插可以做到把某个 key 挪到末尾但如果你需要同时知道 key 原本在第几位、批量移动多个 key普通 dict 给不了这种能力。还有个容易忽略的接口是popitem()。默认它会弹出并返回最后一个插入的元素等价于 LIFO 栈顶。如果你以为它是随机弹测试用例会时好时坏。想要弹出最早插入的元素普通 dict 的popitem(lastFalse)是不支持的只有 OrderedDict 提供类似能力而且 3.8 之后reversed(dict)可以逆序遍历构造“从新到旧”的迭代器但并不能真的移动元素。4.2 dict 与 OrderedDict 怎么选3.7 之后很多教程开始说“普通 dict 已经有序可以替代 OrderedDict 了”这话只对了一半。二者最关键的差异不在“能不能保持顺序”而在“能不能重排顺序”。维度dict3.7OrderedDict默认迭代顺序插入顺序插入顺序更新已有 key 后位置不变不变删除后重新插入移到末尾移到末尾移动已有 key 到末尾不支持move_to_end()弹出最早元素不支持popitem(lastFalse)比较时考虑顺序不考虑考虑逆序遍历3.8 支持reversed(d)支持reversed()内存更紧凑多一些链指针开销普通 dict 的是比较键值对集合{a: 1, b: 2}和{b: 2, a: 1}相等。OrderedDict 比较时则顺序也要相同才相等。这通常能避免不少隐蔽 bug也偶尔会“保护过度”——如果你只关心内容不关心顺序就不要用 OrderedDict 去比较。选型原则其实一句话就够只要不重排、不按顺序比较直接用 dict要重排、要弹出两端时就换 OrderedDict。顺序本身已经白送严肃项目里别再为了“看起来有序”去 import OrderedDict。4.3 数据交换与配置场景的体验提升有序性对 JSON、YAML、配置文件的处理体验提升是实打实的。无序时代里很多接口文档都会写“对象 keys 顺序不保证”开发者只能要么用sort_keysTrue要么让序列化库固定某种规则。但有些配置类数据顺序本身就是语义的一部分比如文档里先写 title 再写 body用户期望回显时也按这个顺序。3.7 下你拿到 YAML 解析结果只要底层是基于普通 dict 的解析器得到的 dict 就会保留文档中的字段顺序如果你再把它序列化回 YAML 或 JSON字段顺序和原始配置基本一致。这对配置对比、表单信息展示、请求链路日志都非常友好。测试断言也可以直接从“比对整个字符串”简化成“对比list(d.keys())”因为顺序已经稳定。需要提醒的是这个特性只保证“插入顺序”而不是“你想要的顺序”。如果你希望 JSON 输出的 key 按字母序排列依然需要json.dumps(..., sort_keysTrue)如果你希望按业务自定义顺序排列不能依赖 dict而要自定义序列化器或者在构造 dict 时故意按目标顺序插入。搞清楚这三者序列化相关的运维坑基本能避开大半。5. 迁移与排查从 3.5 到 3.7 踩过的坑5.1 常见误区与问题速查表几年看下来围绕字典有序性最容易翻车的误解基本可以汇总成一张表误区实际情况字典会自动按键排序错是插入顺序不是自然排序3.6 之后可以放心依赖3.6 只是 CPython 实现细节3.7 才是规范dict dict 会考虑顺序错普通 dict 等值比较不看顺序只有 OrderedDict 看删除再插入后位置不变错会移动到末尾更新值后位置不变对这是核心规则之一普通 dict 可以做 LRU只能通过“删除再重插”单个键模拟不能批量移动**kwargs在 3.5 也保序错PEP 468 自 3.6 起才是规范最常见的就是第一条。曾经有个同事把字典有序理解成“Python 会帮我把 key 排好序”然后写了一堆依赖字母序的校验逻辑最后在 CI 上跑红了。他踩的本质上不是 Python 的版本差异而是“排序”和“插入序”的语义混淆。所以我看到类似问题都会先丢一句确保你的期望是“按照我插入的顺序”而不是“按照某种大小顺序”。5.2 跨版本兼容方案与 CI 建议如果你维护的库还要兼容 Python 3.5 或者更老的版本那么规则很简单不要依赖普通 dict 的任何顺序遇到需要稳定顺序的场合统一用OrderedDict并且不要指望**kwargs能保序。代码里如果已经写了依赖顺序的测试需要加条件分支或者干脆把最低支持版本提到 3.7。我给项目做升级时常做这三件事全局搜索所有OrderedDict的 import先看哪些真的需要重排哪些只是想要“稳定顺序”。把只为了稳定顺序而引入 OrderedDict 的模块改成普通 dict同时写一个基于list(d.keys())的单元测试锁定顺序。在 CI 矩阵里同时跑 3.7、3.8、3.11 等版本确保顺序行为在中间版本没有依赖退化。如果你还停留在 3.6建议尽快升到 3.7 或更高。因为 3.6 的“有序”是实际可用但文档不承诺的状态一旦团队里有人较真解释起来成本很高3.7 才能拍着胸脯说“这是语言规范”。5.3 一点性能与内存观察我在身边不少场景里测过普通 dict 在 3.5 和 3.7 的表现结论和官方给出的方向一致数据量越大compact dict 的内存优势越明显。一个保存几万个对象的缓存字典升级后可以看到 RSS 显著下降在遍历和序列化场景里由于内存连续局部性更好速度也常常有一点提升。但要注意性能和“有序”本身没有直接关系。保留插入顺序只是新存储布局的副产品不是额外加了一层链表去维护顺序——如果是那样开销反而会更大。所以不要担心“因为有序所以变慢”那是个伪命题。也不要为了“更快”而去用 OrderedDict它为了支持重排内部其实保留了一些额外结构一般不会比普通 dict 更快。如果你想量化可以自己在项目上用 tracemalloc 统计一下大字典的峰值内存再结合运行时长做对比。不同 Python 版本之间、不同哈希负载系数下数字会有浮动但方向几乎一致。6. 我的个人迁移经验与最后建议从无序到有序一路用过来我最深刻的体会是这次改变真正改善的是“可读性”和“可复现性”而不是什么惊天动地的性能。以前调试一个多级配置结构输出的 key 顺序东倒西歪想理清层级关系只能靠工具排序现在字典保留原始结构我打印出来基本就是业务文档的顺序排错效率确实高了。具体到操作层面我自己的经验是能简单就不绕。3.7 的项目里默认把 dict 当作“保序容器”来用但如果代码里出现“删除再插入来移动位置”这种写法及时停下来想一想是不是该上 OrderedDict。move_to_end一行能表达清楚的东西不要自己手动维护。最后分享一个小技巧如果你在 3.7 的项目里需要“按最近访问排序”的缓存但又不想引入复杂依赖普通 dict 可以通过d.pop(k); d[k] v完成“放到末尾”配合next(iter(d))拿到最老的 key就能拼出一个非常轻量的 FIFO/LRU。遇到需要频繁重排或按顺序弹出两端元素的场景就换 OrderedDict。这个边界划清楚之后旧代码反而删得更痛快。

相关新闻

S变换短窗能量法:解决缆-线混合配电网故障选线难题

S变换短窗能量法:解决缆-线混合配电网故障选线难题

雷雨季节凌晨两点,某城区配电运维站的值班电话比闹钟还准。监控屏上,四条出线的零序电流同时跳了起来,哪一条是真正发生单相接地的故障线路,波形上看着都差不多,但只要拿尺子去比一组稳态幅值,很快就会发现…

2026/10/13 5:14:27 阅读更多 →
Agent技能独立化架构:让大模型从“能聊”到“能干活”的工程实践

Agent技能独立化架构:让大模型从“能聊”到“能干活”的工程实践

最近接了个活儿,要把一套“只会聊天”的对话系统升级成真正能帮忙干活的智能体。结果我发现,朋友圈里聊得火热的那个“agent-skills”项目,正好就是解决这类问题的关键拼图。这半年我在实际落地项目里反复折腾这套东西,把“技能”…

2026/10/13 5:14:27 阅读更多 →
Python字典为何从无序变有序:3.6紧凑哈希表到3.7规范保证的完整实证

Python字典为何从无序变有序:3.6紧凑哈希表到3.7规范保证的完整实证

Python 的字典到底有没有序?这个问题放到五年前,老手几乎会统一口径:无序,别依赖迭代顺序。而现在你再问同样的问题,答案已经完全反过来了——从 Python 3.7 开始,字典按键的插入顺序迭代,是语言…

2026/10/13 5:14:27 阅读更多 →

最新新闻

西门子PLC实战:锂电浆料线程序开发与通讯调试全流程

西门子PLC实战:锂电浆料线程序开发与通讯调试全流程

很多人找我聊西门子PLC程序开发怎么入门,我一般不会直接甩教程,而是先反问一句:你见过新能源浆料线吗?去年我接手了一条锂电正极浆料产线的整套PLC程序开发,从需求梳理到带料调试,前后折腾了小半年。说句实…

2026/10/13 5:56:39 阅读更多 →
逻辑回归原理与实战:从线性回归到分类算法的完整指南

逻辑回归原理与实战:从线性回归到分类算法的完整指南

第一次接触逻辑回归的人,十有八九会被它的名字带偏——明明叫“回归”,翻开文档才发现它是个分类算法。我刚入行那年就踩过这个认知坑,一度以为它是用来预测房价的。后来在好几个分类项目里把它用熟了,才意识到这个“名字有歧义”…

2026/10/13 5:56:39 阅读更多 →
表格解析新思路:先看懂结构再生成答案,复杂表格不再答错

表格解析新思路:先看懂结构再生成答案,复杂表格不再答错

表格解析这个方向,做文档智能的人应该都不陌生。以前大家的习惯做法很简单:直接把一整张表格图像和问题一起丢给多模态模型,让它端到端输出答案。看着挺省事,但一落到真实场景——带合并单元格的财务报表、跨页的长规格书、行列爆…

2026/10/13 5:56:39 阅读更多 →
已完成研究,现在撰写文章

已完成研究,现在撰写文章

桌面应用 【免费下载链接】QOwnNotes QOwnNotes is a plain-text file notepad and todo-list manager with Markdown support and Nextcloud / ownCloud integration. 项目地址&#xff1a; https://gitcode.com/gh_mirrors/qo/QOwnNotes 点击查看 免费下载 <output_artic…

2026/10/13 5:56:39 阅读更多 →
快速去掉 Windows 与 Office 未激活水印:MAS 3.12 免费激活四步指南

快速去掉 Windows 与 Office 未激活水印:MAS 3.12 免费激活四步指南

快速去掉 Windows 与 Office 未激活水印&#xff1a;MAS 3.12 免费激活四步指南 【免费下载链接】Microsoft-Activation-Scripts Open-source Windows and Office activator featuring HWID, Ohook, TSforge, and Online KMS activation methods, along with advanced troubles…

2026/10/13 5:56:39 阅读更多 →
ZMK 电源管理行为实战:用 `ext_power` 控制外部电源(VCC)输出以节省电量

ZMK 电源管理行为实战:用 `ext_power` 控制外部电源(VCC)输出以节省电量

固件嵌入式智能硬件蓝牙 【免费下载链接】zmk ZMK Firmware Repository 项目地址&#xff1a; https://gitcode.com/gh_mirrors/zm/zmk 点击查看 免费下载 本文以 ZMK 固件仓库中的电源管理行为文档&#xff08;docs/docs/keymaps/behaviors/power.md&#xff09;为核心&#…

2026/10/13 5:55:39 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目&#xff0c;我最大的感受是&#xff0c;大部分坑不是出在技术前沿&#xff0c;而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节&#xff0c;最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了&#xff0c;很难不碰到舵机控制这道坎。做智能小车要转方向&#xff0c;做机械臂要抬关节&#xff0c;做云台要偏航俯仰&#xff0c;背后都是同一个东西在干活&#xff1a;舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”&#xff1f;——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台&#xff1f;或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜&#xff1f;又或者&#xff0c;在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →