Ruby Hash 和 Python 字典有什么区别?

22 投票
3 回答
10163 浏览
提问于 2025-04-18 06:04

在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 个回答

5

现在,Ruby 也支持以下语法:

residents = {'Puffin': 104, 'Sloth': 105, 'Burmese Python': 106}

但是我们应该通过符号的方式来访问这些值:

residents[:Puffin]
9

在Python中的字典和Ruby中的哈希其实是一样的,基本上可以看作是同一种东西。它们实现了一种通用的字典/哈希表,也就是一种存储键值对的方式。你可以用一个独特的键来存储一个条目,然后快速查找这个键对应的值。

21

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还提供了defaultdictOrderedDict的实现,这些实现与标准的dict有不同的行为和功能。这些实现允许使用默认值生成器、处理缺失键的情况,并提供额外的顺序保证,这些在标准的dict中是没有的。

2 在Python中,某些核心类型(例如listdict)明确不支持哈希,因此不能作为基于哈希的字典的键。虽然这并不是dict本身的严格区别,但仍然可以使用可变的自定义类型作为键,尽管在大多数情况下不推荐这样做。

撰写回答