Ruby Hash 和 Python 字典有什么区别?
在Python中,有一种叫做字典的东西:
residents = {'Puffin' : 104, 'Sloth' : 105, 'Burmese Python' : 106}
在Ruby中,有一种叫做哈希的东西:
residents = {'Puffin' => 104, 'Sloth' => 105, 'Burmese Python' => 106}
它们唯一的区别就是使用的符号不同,一个用:
,另一个用=>
。不过要注意,如果例子中用的是变量而不是字符串,那就没有语法上的区别了。
在Python中,你可以通过一个键来获取字典中的值:
residents['Puffin']
# => 104
在Ruby中,你也可以通过一个键来获取哈希中的值:
residents['Puffin']
# => 104
看起来它们是一样的。
那么,Ruby中的哈希和Python中的字典有什么不同呢?
3 个回答
现在,Ruby 也支持以下语法:
residents = {'Puffin': 104, 'Sloth': 105, 'Burmese Python': 106}
但是我们应该通过符号的方式来访问这些值:
residents[:Puffin]
在Python中的字典和Ruby中的哈希其实是一样的,基本上可以看作是同一种东西。它们实现了一种通用的字典/哈希表
,也就是一种存储键值对的方式。你可以用一个独特的键来存储一个条目,然后快速查找这个键对应的值。
Ruby的Hash和Python的字典都属于一种叫做“映射”的抽象数据类型(ADT)。
简单来说,映射就是一种数据结构,它由一组“键-值”对组成,每个键在这组数据中只能出现一次。
此外,Ruby的Hash和Python的字典都是通过“哈希表”来实现的,这就要求键必须是可以被哈希和比较的。一般来说,在哈希表上进行插入、删除和获取操作的时间复杂度是O(1),也就是说这些操作很快,和哈希表的大小无关。
哈希表是一种数据结构,用来实现映射,它可以把键映射到对应的值。哈希表使用哈希函数来计算一个索引,这个索引指向一个存放数据的数组,从中可以找到正确的值。
当然,还有一些实现映射的方式是用树,而不是哈希表,这种方式通常出现在持久化和函数式编程的场景中。
当然,Ruby和Python在设计上也有一些不同的选择,以及它们提供的具体默认映射实现:
- 当查找一个不存在的键时的默认行为:在
Hash
中返回nil
,而在dict
中会抛出异常1 - 插入顺序的保证:在
Hash
中是有保证的(从Ruby 2.0开始),而在dict
中没有保证(直到Python 3.6)1 - 能够指定默认值生成器:只有
Hash
支持1 - 可以使用核心可变类型(例如列表)作为键:只有
Hash
支持2 - Hash和dict的字面量语法等。
两种语言都支持[]
这种语法,方便使用,但它们的底层实现和在缺少键时的语义是不同的。
1 Python还提供了defaultdict
和OrderedDict
的实现,这些实现与标准的dict
有不同的行为和功能。这些实现允许使用默认值生成器、处理缺失键的情况,并提供额外的顺序保证,这些在标准的dict
中是没有的。
2 在Python中,某些核心类型(例如list
和dict
)明确不支持哈希,因此不能作为基于哈希的字典的键。虽然这并不是dict
本身的严格区别,但仍然可以使用可变的自定义类型作为键,尽管在大多数情况下不推荐这样做。