问题历史:
字典(dict)是Python的基本数据类型之一,代表“键-值”结构。字典从Python的第一个版本就出现了,但它们的内部实现和行为特性不断得到改进(例如,在Python 3.7中保证了插入顺序)。
问题:
理解字典的结构对于有效编写代码至关重要。不了解细节会导致在使用可变类型作为键时出现bug,在复制嵌套字典时,也会在非标准操作中出现问题。
解决方案:
字典实现为哈希表,键必须是可哈希的(不可变的)。通过键访问值的时间复杂度接近O(1),但在某些情况下会出现特性——例如,在发生冲突或处理大量数据时。
代码示例:
person = {'name': 'Alice', 'age': 30} person['city'] = 'Moscow' print(person['name']) # Alice
关键特性:
可以将列表(list)作为字典中的键吗?
不能,列表是可变的,不是可哈希的。尝试使用列表将引发错误。
d = {} d[[1, 2, 3]] = 'value' # TypeError: unhashable type: 'list'
如果使用两个内容相同的元组作为键会发生什么?
如果这两个元组包含相同的数据且本身是不可变的,那么它们被视为相等,字典中的键将匹配:
t1 = (1, 2) t2 = (1, 2) d = {t1: 'a'} print(d[t2]) # 'a'
在复制字典的元素时,遍历元素的顺序会改变吗?
在Python 3.7+版本中,顺序会保留。在早期版本中,遍历顺序不保证。
d1 = {'a': 1, 'b': 2} d2 = dict(d1) print(list(d2)) # ['a', 'b']
=不会创建副本,而是创建对同一对象的新“指针”。dict.get()而不检查None可能会导致意外错误,如果值== None。程序员将列表存储为键,错误地认为元组和列表在Python中是等效的作为键。出现“unhashable type”等异常。
优点:
可以快速尝试一些“非正式的东西”,使用任何结构。
缺点:
运行时错误,数据处理中的bug。
只使用不可变(可哈希)对象作为键,元组的设计考虑到不包含可变元素。
优点:
按键快速查找,结构可靠,易于处理和复制。
缺点:
如果数据复杂,需要额外的处理以将结构转换为不可变形式(例如,元组内部的序列化)。