在 Python 中,字典(Dictionary) 是最常用、也是最强大的数据结构之一。它和我们现实生活中使用的字典非常相似:在现实中的字典里,你通过“拼音或部首”查找到具体的“释义”;在 Python 字典中,你通过**“键(Key)”来查找对应的“值(Value)”**。

这被称为**“键值对(Key-Value pairs)”**映射。

下面我们从零开始,一步步拆解 Python 字典的用法。


1. 字典的四大核心特征

  • 通过键来访问: 字典里的元素没有索引(不像列表用 [0][1] 访问),而是通过独一无二的“键”来获取“值”。
  • 键必须是唯一的: 同一个字典里不能有两个相同的键。如果强行写入相同的键,后面的值会覆盖前面的值。
  • 键必须是不可变类型: 字符串、数字、元组可以作为键;但列表、字典不能作为键。值(Value)则可以是任何数据类型。
  • 有序性(Python 3.7+): 从 Python 3.7 开始,字典会记住你添加元素的顺序(在这之前的版本中,字典是无序的)。

2. 创建字典

创建字典主要使用大括号 {},键和值之间用冒号 : 隔开,不同的键值对用逗号 , 隔开。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 创建一个空字典
empty_dict = {}
# 或者使用 dict() 函数
empty_dict_2 = dict()

# 2. 创建一个包含信息的字典
person = {
"name": "张三",
"age": 25,
"city": "北京",
"is_student": False
}

print(person)
# 输出: {'name': '张三', 'age': 25, 'city': '北京', 'is_student': False}

3. 获取字典里的值(查)

获取值有两种常用方法:方括号 [].get() 方法。

方法 A:使用方括号 []

1
2
3
4
print(person["name"])  # 输出: 张三

# ⚠️ 注意:如果键不存在,会直接报错 (KeyError)
# print(person["job"]) # 会报错!

方法 B:使用 .get() 方法(推荐!)

这种方法更安全,如果键不存在,它不会报错,而是默认返回 None(或者你自定义的默认值)。

1
2
3
print(person.get("age"))      # 输出: 25
print(person.get("job")) # 输出: None
print(person.get("job", "无业")) # 输出: 无业 (因为找不到 "job",所以返回自定义的 "无业")

4. 添加和修改元素(增、改)

在字典中,添加新元素和修改旧元素的语法是一模一样的:如果键存在,就修改;如果键不存在,就新增。

1
2
3
4
5
6
7
8
# 修改已有键的值
person["age"] = 26
print(person["age"]) # 变成了 26

# 添加新的键值对
person["job"] = "程序员"
print(person)
# 输出多了 'job': '程序员'

你也可以使用 .update() 方法一次性添加或修改多个键值对:

1
2
person.update({"city": "上海", "hobby": "读书"})
# "city" 会被改为"上海",同时新增了 "hobby"

不能使用.get()修改字典的值,.get() 是一个**只读(Read-only)**的操作。它的作用仅仅是去字典里“查询”并“返回”那个值给你,而不是给你一个可以直接修改底层数据的通道。


5. 删除元素(删)

有三种常见的删除方式:

  • del 关键字: 直接删除指定的键值对。

    1
    del person["is_student"]
  • .pop() 方法: 删除并返回被删除的值。这在你想把删掉的数据拿去别的地方用时很有帮助。

    1
    2
    job = person.pop("job")
    print(job) # 输出: 程序员
  • .clear() 方法: 清空字典里的所有内容。

    1
    2
    person.clear()
    print(person) # 输出: {}

6. 遍历字典(循环)

如果你想用 for 循环把字典里的内容过一遍,有三种常用的视角:

1
2
3
4
5
6
7
8
9
10
11
12
13
student_scores = {"小明": 90, "小红": 95, "小刚": 88}

# 1. 遍历所有的键 (Keys) - 这是默认行为
for name in student_scores.keys():
print(name)

# 2. 遍历所有的值 (Values)
for score in student_scores.values():
print(score)

# 3. 同时遍历键和值 (Items) - 最常用的方式
for name, score in student_scores.items():
print(f"{name} 的分数是: {score}")

7. 字典嵌套 (Nested Dictionaries)

字典里的值也可以是另外一个字典,这非常适合用来表示复杂的数据结构(比如处理类似 JSON 的格式)。

1
2
3
4
5
6
7
8
9
10
11
12
13
users = {
"user1": {
"name": "李四",
"age": 30
},
"user2": {
"name": "王五",
"age": 28
}
}

# 如何获取王五的年龄?
print(users["user2"]["age"]) # 输出: 28

8. 修改字典的键

能不能修改字典的键?

在 Python 中,字典的键是基于哈希表(Hash Table)实现的,这意味着一旦一个键被创建,它的“身份”就是固定的。你无法像重命名文件那样直接把 "age" 这个键名改成 "brother_age"

但是,你可以通过**“搬家”**的方式来达到修改键名的效果:把旧键对应的值赋给新键,然后把旧键删掉。

这里有三种常见的方法来实现这个“改名”操作:

方法一:最优雅、最 Pythonic 的做法(使用 .pop()

这是最推荐的做法,一行代码搞定。.pop("age") 会把 "age" 的值(26)提取出来,同时把 "age" 从字典里删掉。然后我们直接把提取出来的值赋给新的键 "brother_age"

1
2
3
4
5
6
7
person = {"name": "张三", "age": 26}

# 把 "age" 弹出来,赋值给 "brother_age"
person["brother_age"] = person.pop("age")

print(person)
# 输出: {'name': '张三', 'brother_age': 26}

方法二:最容易理解的拆解法(分两步走)

如果你觉得上面的代码不够直观,可以把它拆分成两步:先给新键赋值,再删除旧键。

1
2
3
4
5
6
7
8
9
10
person = {"name": "张三", "age": 26}

# 第一步:把旧键的值赋给新键
person["brother_age"] = person["age"]

# 第二步:删掉旧键
del person["age"]

print(person)
# 输出: {'name': '张三', 'brother_age': 26}

⚠️ 进阶注意事项:如果旧键不存在怎么办?

在实际写代码时,如果使用上面两种方法,万一字典里本来就没有 "age" 这个键,程序就会报错(KeyError)。

1. 使用 if 提前检查(最直观、最稳妥,强烈推荐)

这是最符合人类直觉的做法:在动手“搬家”之前,先去房间里看一眼人到底在不在。在不在,决定了我们做不做。

1
2
3
4
5
6
7
8
9
10
11
person = {"name": "张三", "job": "程序员"}  # 注意:这里并没有 "age" 键

# 提前检查 "age" 是否在字典的键里面
if "age" in person:
person["brother_age"] = person.pop("age")
print("改名成功!")
else:
print("字典里没有 'age' 这个键,跳过操作,程序继续安全运行。")

print(person)
# 输出: {'name': '张三', 'job': '程序员'} (因为没有 age,所以什么都没改变,但程序没有崩溃)
2. 给 .pop() 加上“默认值”(进阶用法)

.pop() 其实隐藏了一个高级功能:你可以给它传第二个参数作为“默认值”。 语法是:字典.pop(键名, 默认值)

它的逻辑是:

  1. 如果找到了键,就把它弹出来。
  2. 如果没找到键,它不会报错,而是直接返回你设置的“默认值”。
1
2
3
4
5
6
7
8
9
10
11
person = {"name": "张三"}

# 试图弹出 "age",如果找不到,就返回 None
age_value = person.pop("age", None)

# 然后判断一下,如果拿到的不是 None,说明真的找到了数据,再进行赋值
if age_value is not None:
person["brother_age"] = age_value

print(person)
# 输出: {'name': '张三'} (安全略过)

⚠️ 这里的避坑指南: 千万不要直接写成

1
person["brother_age"] = person.pop("age", None)

如果这么写,当 "age" 不存在时,.pop() 会返回 None,结果你的字典里就会莫名其妙多出一个废数据:

{'name': '张三', 'brother_age': None}

所以配合 if 判断一下拿到的值是不是 None 是很有必要的。