Python字典基础用法:创建、访问与增删改查详解

何川
何川
发布时间:2026-11-15 | 4人浏览过
原创

系统介绍Python字典的核心概念与基础用法,全面解析字典的底层映射原理、五种初始化创建方式、安全访问路径以及增删改查实用方法与避坑要点。

字典(dict)是 Python 中最核心的高效映射结构,采用键值对(Key-Value)形式组织关联数据。本文将从底层哈希映射机制展开,逐一拆解字典的创建途径、安全访问方式以及增、删、改、查(CRUD)的具体方法与避坑规则,帮助读者建立清晰、严谨的操作习惯。

一、Python 字典的核心概念与存储原理

在 Python 中,字典以可变容器的形式存在,每个元素由“键(Key)”与“值(Value)”一一对应绑定。自 Python 3.7 开始,标准字典正式保证元素的插入顺序与遍历顺序严格一致。

与列表通过整数下标顺序定位不同,字典利用哈希表(Hash Table)实现键到值的快速检索。这意味着无论字典存储了十条记录还是一百万条记录,通过键查找对应值的平均时间复杂度均为 O(1)。

键(Key)的硬性要求:必须是不可变对象且可哈希(Hashable)。
字符串(str)、整数(int)、浮点数(float)以及仅包含不可变元素的元组(tuple)可以作为键;而列表(list)、集合(set)和字典本身等可变类型不能作为键,否则会触发 TypeError: unhashable type。对于字典的值(Value),则没有任何类型限制,可自由嵌套任意对象。
Python字典基础用法:创建、访问与增删改查详解
图1:Python 字典键值哈希映射与底层存储结构关系

二、字典的创建与初始化方式

在日常开发中,根据数据来源的不同,主要有以下五种创建与初始化字典的常用手段:

1. 花括号字面量(推荐首选)

字面量语法最为直观且执行性能最高,适用于预先已知键值对的定义场景:

# 空字典创建
empty_dict = {}

# 包含初始键值对的字典
user_profile = {
    "id": 1001,
    "username": "alex_dev",
    "is_active": True,
    "tags": ["backend", "python"]
}

2. dict() 构造函数

利用 dict() 可通过关键字实参或键值对元组序列创建字典:

# 方式一:关键字参数传参(键必须为合法变量标识符且均为字符串)
point = dict(x=10, y=20, z=0)

# 方式二:双元组序列转换(常用于两列数据的格式转换)
pairs = [("apple", 5), ("banana", 8), ("orange", 12)]
fruit_prices = dict(pairs)

3. dict.fromkeys() 批量初始化

当需要将一系列键赋予相同的初始默认值时,可以使用类方法 fromkeys(iterable, default):

fields = ["name", "email", "phone"]
# 默认初始值为 None,亦可传入 0 或具体不可变对象
user_form = dict.fromkeys(fields, "")
# 结果: {'name': '', 'email': '', 'phone': ''}
注意事项:避免向 fromkeys() 传入可变默认值。
如果执行 dict.fromkeys(['a', 'b'], []),所有键将共享同一个底层列表实例。修改 d['a'].append(1) 会同时改变 d['b'] 的内容。若需独立可变对象,请使用字典推导式。

4. 字典推导式(Dictionary Comprehension)

结合循环与条件过滤,从现有列表或生成器动态计算并组装字典:

# 对偶数生成其平方字典
even_squares = {n: n ** 2 for n in range(10) if n % 2 == 0}
# 结果: {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
Python字典基础用法:创建、访问与增删改查详解
图2:字典四种初始化机制与适用场景对比

三、字典元素的访问与安全查询

访问字典元素最直接的方式是通过方括号中括号 d[key],但在键不存在时该操作会直接抛出错误。为保证程序鲁棒性,需根据业务容错需求选择合适的查询路径。

1. 方括号下标访问与 KeyError 风险

config = {"host": "127.0.0.1", "port": 8080}
print(config["host"])  # 输出: 127.0.0.1

# 若键不存在,直接触发异常
# print(config["timeout"]) -> 抛出 KeyError: 'timeout'

只有当你确信键一定存在、或者希望缺失键时立即中断报错以暴露配置问题时,才使用中括号索引。

2. 使用 get() 方法平滑容错

dict.get(key, default=None) 是最通用的安全访问方案。如果键不存在,它不会抛出异常,而是返回默认值:

# 未指定 default 时,缺失键返回 None
timeout = config.get("timeout")
print(timeout)  # 输出: None

# 自定义兜底默认值
timeout_with_default = config.get("timeout", 30)
print(timeout_with_default)  # 输出: 30

3. 使用 in 关键字进行成员检测

在执行读写前,可以使用 key in dict 检查键是否存在,时间复杂度同样为 O(1):

if "port" in config:
    print(f"服务端口配置为: {config['port']}")

4. setdefault() 查取与懒加载初始赋值

dict.setdefault(key, default) 会先检查键是否存在:若存在则直接返回原值;若不存在,则先在字典中写入 {key: default},再返回该 default。这常用于统计或分组任务中初始化空容器:

student_scores = {}
# 若学生不存在,则先将其值设为空列表 [],再追加成绩
student_scores.setdefault("XiaoMing", []).append(95)
student_scores.setdefault("XiaoMing", []).append(88)
print(student_scores)  # 输出: {'XiaoMing': [95, 88]}
Python字典基础用法:创建、访问与增删改查详解
图3:字典键值读取判定流程与异常控制逻辑

四、字典的增、改、删核心操作

字典是就地可变对象(Mutable),支持高效的动态修改与键值清理。

1. 增加与修改元素

增加新键值对与修改已存在的键语法完全一致:赋值语句 d[key] = value。若 key 原本不存在则作为新元素追加;若 key 已存在则覆盖其旧值。

user = {"name": "LiLei", "age": 24}

# 修改已有键的值
user["age"] = 25

# 新增原本不存在的键值对
user["city"] = "Shanghai"
# 结果: {'name': 'LiLei', 'age': 25, 'city': 'Shanghai'}

2. 批量合并与更新:update() 与合并运算符 |

当需要把另一个字典或键值对迭代器批量混入当前字典时,可以使用 update() 方法或 Python 3.9+ 引入的合并运算符:

base_info = {"id": 101, "role": "user"}
extra_info = {"role": "admin", "token": "xyz999"}

# 方法 1:原地合并 (就地修改 base_info)
base_info.update(extra_info)
# base_info 变为: {'id': 101, 'role': 'admin', 'token': 'xyz999'}

# 方法 2:合并运算符 (Python 3.9+,生成全新字典)
merged = base_info | {"status": "online"}

3. 删除元素的四种途径

方法 / 语法 返回值 键不存在时的行为 典型应用场景
del d[key] 无(语句) 抛出 KeyError 确信键存在时的极速清理
d.pop(key, [default]) 被删除键的值 未传 default 则抛 KeyError;传 default 返回该值 弹出数据并转存、安全删除并容错
d.popitem() (key, value) 双元组 字典为空时抛 KeyError 后进先出(LIFO)处理尾部元素
d.clear() 无 不会抛错,清空所有条目 重用现有字典对象,避免重新绑定
data = {"a": 1, "b": 2, "c": 3}

# pop 取出并删除 'b'
val = data.pop("b")
print(val)   # 输出: 2

# pop 提供兜底值避免 KeyError
missing = data.pop("not_exist", "N/A")
print(missing) # 输出: N/A

# popitem 弹出最后一项 (c: 3)
item = data.popitem()
print(item)  # 输出: ('c', 3)

五、字典的遍历与视图对象

字典提供了三种动态视图对象:keys()、values() 与 items()。它们不是静态列表,而是对字典底层数据的动态实时窗口。

inventory = {"pen": 12, "notebook": 5, "eraser": 20}

# 1. 遍历键(直接遍历字典默认遍历键)
for item_name in inventory:
    print(item_name)

# 2. 遍历值
for qty in inventory.values():
    print(qty)

# 3. 同时遍历键和值(最常用推荐)
for item_name, qty in inventory.items():
    print(f"{item_name}: {qty}件")
高频陷阱:遍历过程中不可直接增删键!
在 for k in d: 循环体中调用 del d[k] 或 d['new'] = 1 会触发 RuntimeError: dictionary changed size during iteration。
正确解法:对键列表的快照进行迭代,如 for k in list(d.keys()):。

六、字典核心知识与方法全景总结

为了在实际编码中能够快速选型并精准应对各类数据操作需求,下图对 Python 字典的基础定义规则、CRUD 核心 API、时间复杂度及高频踩坑要点进行了工程化归纳总结:

Python字典基础用法:创建、访问与增删改查详解
图4:Python 字典基础增删改查与常用方法全景图谱

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表