You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.11中dict两种传参返回结果差异的原因

问题原因解析

首先明确两种dict()构造方式的本质区别:

  • dict({4: None})是直接传入一个字典实例,构造函数会直接复制该字典的键值对,结果自然符合预期。
  • dict([{4, None}])则是传入一个包含集合的列表,此时dict()会遍历列表中的每个元素(也就是这个集合),并将集合迭代出的前两个元素分别作为键和值生成字典——但集合是无序容器,迭代顺序由CPython的哈希表实现决定。

核心原因:集合的迭代顺序依赖哈希值与哈希表结构

在CPython中,集合的迭代顺序由元素的哈希值和哈希表的槽位分布决定:

  1. 小整数的哈希值等于自身,即hash(n) = n;None的哈希值固定为0。
  2. CPython集合的初始哈希表大小为8,元素会被放到哈希值 % 哈希表大小对应的槽位中,迭代时按槽位顺序遍历。

分情况拆解:

  • 当n为4-7时:n % 8 = n,None %8=0。0号槽位在n对应的槽位(4-7号)之前,所以迭代时None先被取出,作为键;n后被取出,作为值,最终得到{None: n}。
  • 当n为8及以上时:以8为例,8%8=0,和None的哈希槽位冲突。CPython在处理哈希冲突时,会将整数8放在None的前面(由内部冲突解决逻辑决定),所以迭代时n先被取出,作为键;None后被取出,作为值,最终得到{n: None}。

关键提醒

从Python语言规范来说,集合的迭代顺序是未定义的,绝对不能依赖这种特定顺序编写代码。如果要生成确定的键值对,应该使用元组(比如dict([(4, None)]))而非集合——元组是有序结构,能保证键值对的顺序稳定。

内容的提问来源于stack exchange,提问作者Sandipan Guha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:30:16