![]() |
1
231
顺序不是任意的,而是取决于字典或集合的插入和删除历史,以及特定的Python实现。对于这个答案的其余部分,对于“dictionary”,您还可以读取“set”;set被实现为只有键而没有值的字典。 下一个 基于已经存在的东西的插槽。 目前
这将通知他们的上市顺序:
除了3和4以外的所有插槽都是空的,在表上循环首先列出插槽3,然后列出插槽4,所以
现在,它们的顺序取决于第一个槽中的键;第二个槽中的键必须移动到下一个槽中:
CPython(最常用的Python实现)使用的底层结构的技术名称是
hash table
,一种使用开放寻址的方法。如果你很好奇,并且对C有足够的了解,可以看看
C implementation
Pycon 2010 presentation by Brandon Rhodes
关于CPython
也 其他实现可以自由地为字典使用不同的结构,只要它们满足文档化的Python接口,但是我相信到目前为止所有实现都使用散列表的变体。
CPython 3.6引入了
新的
如果您想要一个有序的集合,可以安装
|
![]() |
2
36
Python 3.41 A set 在它作为副本关闭之前。
也就是说,有 你可以依赖的东西:
也就是说,顺序是 稳定的 理解为什么 秩序需要理解以下几点:
从顶部: Hash集 是一种存储随机数据的方法,查找时间非常快。 它有一个后备阵列:
我们将忽略特殊的虚拟对象,它只用于使移除更容易处理,因为我们不会从这些集合中移除。 为了快速查找,您可以使用一些魔术从对象中计算散列。唯一的规则是两个相等的对象具有相同的哈希值。(但如果两个对象具有相同的哈希值,则它们可能不相等。)
这使得访问元素变得非常快。
散列只是故事的大部分,因为
所以当你创建一个数组时,后备存储器的长度是8。当它是5个满的并且您添加了一个元素时,它将简短地包含6个元素。
我们有
所以我们希望
有一个或33个不是在别的地方开始的。这将使用线性探测,因此我们将:
你可能会认为33是因为1已经存在而被替换的,但是由于在创建集合时发生的大小调整,事实并非如此。每次重新生成集合时,已添加的项都会有效地重新排序。 现在你知道为什么了
前13个插槽中有1到13个哈希值。20进20号槽。
55进槽
如果我们选择50,我们会期待
你瞧:
这是所有实现细节。 |
![]() |
3
16
“武断”和“不确定”不是一回事。 他们所说的是字典迭代顺序没有“在公共接口中”的有用属性。几乎可以肯定的是,迭代顺序的许多属性完全由当前实现字典迭代的代码决定,但是作者并没有向您承诺它们是可以使用的。这使他们可以更自由地在Python版本之间(甚至只是在不同的操作条件下,或者在运行时完全随机地)更改这些属性,而不必担心程序会崩溃。 因此,如果您编写的程序依赖于 任何财产 对于dictionary-order,那么您就“违反了”使用dictionary类型的约定,而Python开发人员并没有承诺这将始终有效,即使在您测试dictionary类型时它现在似乎可以工作。这基本上相当于在C语言中依赖“未定义的行为”。 |
![]() |
4
6
这个问题的其他答案都很好,写得很好。操作询问“如何”,我将其解释为“他们如何逃脱”或“为什么”。 Python文档说 dictionaries abstract data type associative array . 正如他们所说
换句话说,计算机科学的学生不能假设一个关联数组是有序的。同样的道理也适用于 math
使用哈希表实现字典是 implementation detail 有趣的是,就顺序而言,它与关联数组具有相同的属性。 |
![]() |
5
5
Python使用 hash table 用于存储字典,因此字典或其他使用哈希表的iterable对象中没有顺序。
但是对于hash对象中项的索引,python根据以下代码计算索引
within
因此,由于整数的散列值是整数本身
索引是以数字为基础的(
考虑下面的例子
对于数字
注意
在这种情况下
为了
有关python散列函数的更多详细信息,可以从 python source code :
*类的哈希函数
|
![]() |
6
0
从Python 3.7开始 already in CPython 3.6 stay in the order they were inserted . |
![]() |
Cam · Pandas列表日期到日期时间 7 月前 |
![]() |
LMC · Numpy数组布尔索引以获取包含元素 7 月前 |
![]() |
vr8ce · 非成对标记中特定字符的正则表达式 8 月前 |
![]() |
ShaAnder · 为什么sqllachemy返回的是类而不是字符串 8 月前 |
![]() |
Pernoctador · Python映射可以复制吗?我需要参考地图 8 月前 |