字典和列表数据结构在内存中的表现有何不同?

1 投票
4 回答
3067 浏览
提问于 2025-04-16 16:25

比如说,如果我写了以下代码:

a_list = ['this', 'is', 'a', 'sentence']
a_dict = { 0: 'this', 1 : 'is', 2 : 'a', 3 : 'sentence'}

然后在命令提示符中输入

>a_list[0]

会得到

>'this'

同样的结果也可以通过

>a_dict[0]

得到

>'this'

如果严格按照上面的方式说,列表是一种字典,这样说对吗?因为它的键是从0开始的整数。在我看来,它们在这个抽象层面上似乎是一样的。那么在内存中,这两种我认为功能上等价的结构占用的空间有什么不同?还有在Python中,我们访问这些值的速度又有什么差别呢?字典可以看作是一个数学上的映射,而将正整数映射到值的这个映射在数学上等同于一个列表。根据上面的限制,我说它们在功能上是一样的,这样说对吗?那么在Python中,它们的实际或计算上的区别是什么呢?

4 个回答

0

说一个列表是字典的一种类型,其中的键是从0开始的整数,这样说有什么问题呢?

因为这说法不对。字典可以有像0、2、4、6、8、10这样的键,但列表不行。列表没有键,它有的是元素的索引。

功能上它们必须是一样的,

为什么?它们并不一样。列表是一种数据结构,设计用来高效地遍历和顺序访问。而字典是哈希表的一种实现,设计用来随机访问。

那么它们在内存中占用的空间和在Python中访问值的速度有什么区别呢?

这两种对象完全不同。当你在解释器中访问或使用这些类型时,实际执行的代码也是完全不同的。它们是为了不同的目的而设计的。

那么在Python中,实际或计算上的区别是什么呢?

你应该了解一下数据结构。数组和哈希表有不同的用途和应用。Python的列表和字典是这些结构的实现,使用的目的也不同。它们的性能特征、抽象数据类型和应用场景都是完全不同的。

1

列表

字典

尽量不要把它们搞混。

3

在Python中,字典的键不仅限于整数,任何可以被称为可哈希的东西都可以作为键,比如字符串、元组等等。实际上,在Python的字典中使用整数作为键并不是最常见的用法。

Python的列表可以看作是简单的动态数组(类似于C++中的std::vector)。而字典则是通过哈希表来实现的(在即将到来的C++0x标准中是std::unordered_map)。

那么,为什么不总是使用字典而不是列表呢?因为在很多操作中,列表是更合适的数据结构——它比字典更快、更小。例如,如果你只需要一个线性的项目列表,应该使用列表而不是字典——列表会占用更少的空间,索引访问会更快,并且会保持插入的顺序。是的,如果你不在乎性能和顺序,可能可以用字典代替列表。


附言:在一些语言中(如果我没记错的话,比如Lua),数组是通过带有数字键的哈希表来实现的,所以你想要定义的等价关系是存在的。

撰写回答