Python 中的 Dictionary 是一个无序的数据值集合,用于像地图一样存储数据值,与其他只保存单个值作为元素的数据类型不同,Dictionary 保存键:值对。字典中提供了键值以使其更加优化

这本字典由许多桶组成。每个桶都包含包含键值对的对象的哈希代码。指向键对象的指针和指向值对象的指针。

下图为词典内部结构:

Python 字典内部结构_python

这本字典从 8 个空桶开始。然后,每当达到其容量时,通过将条目数量增加一倍来调整大小。在 32 位机器上总计至少 12 个字节,在 64 位机器上总计至少 24 个字节

示例 1: 一个空的 python 字典消耗 240 字节

Python 3

# code
import sys

d = {}
print(sys.getsizeof(d))

输出:

240

例 2 。我们第一次创建字典时,它只包含 8 个可以填充键值对的槽。

Python 3

# code
import sys

d = {}
d['python'] = 1
print(sys.getsizeof(d))

输出:

240

如你所见,增加一些内容后,字典的大小仍然不变。字典储存在还没满的桶里。

例 3:

键值不存储在字典中,即使我们增加了键值的大小,字典的大小也不会改变

Python 3

import sys

d = {}
d['a'] = 'a' * 100000
print("Size of dictionary ->", sys.getsizeof(d))
print("Size of a ->", sys.getsizeof('a'))

Output

Size of dictionary -> 240
Size of a -> 50

输出:

Size of dictionary -> 240
Size of a -> 50

示例 4: 如果我们从字典中删除条目,字典的大小仍然是相同的。

Python 3

# code
import sys

d = {}
d['python'] = 1
for key in list(d.keys()):
  d.pop(key)

print(len(d))
print(sys.getsizeof(d))

输出:

0
240

在这里,你可以看到字典没有释放它分配的内存。它从哈希表中移除引用,但值在内存中。因为它没有被分配,可能会成为垃圾收集的一部分。

示例 5: 如果我们使用 clear 方法清空字典,它的大小比初始化的空字典小 72 字节,即 240 字节

Python 3

import sys

d = {}
d['python'] = 1
for key in list(d.keys()):
  d.pop(key)

print(len(d))
d.clear()
print(sys.getsizeof(d))

输出:

0
72

这是因为该方法会清除内存。它还会清除初始默认空间,即字典中分配的 8 个存储桶。