1. 基本解包
解包的最基本形式是将一个序列中的元素分别赋值给多个变量。
示例
1
2
3
4
a, b, c = [1, 2, 3]
print(a) # 输出: 1
print(b) # 输出: 2
print(c) # 输出: 3
这里,列表 [1, 2, 3] 被解包,分别赋值给 a、b 和 c。
2. 使用 * 捕获多余元素
当序列中的元素数量多于变量数量时,可以使用 * 来捕获多余的元素,并将它们存储为一个列表。
1
2
3
4
a, *b, c = [1, 2, 3, 4, 5]
print(a) # 输出: 1
print(b) # 输出: [2, 3, 4]
print(c) # 输出: 5
a 匹配第一个元素 1。
c 匹配最后一个元素 5。
*b 捕获中间的所有元素 [2, 3, 4]。
3. 解包的应用场景
解包在 Python 中有很多实际应用场景,以下是一些常见的例子:
(1) 函数参数传递
解包可以用于将列表或元组的元素作为参数传递给函数。
1
2
3
4
5
6
def add(a, b, c):
return a + b + c
numbers = [1, 2, 3]
result = add(*numbers) # 等价于 add(1, 2, 3)
print(result) # 输出: 6
(2) 交换变量值
解包可以轻松交换两个变量的值,而不需要临时变量。
1
2
3
4
x, y = 10, 20
x, y = y, x # 交换 x 和 y 的值
print(x) # 输出: 20
print(y) # 输出: 10
(3) 处理不定长输入
解包非常适合处理长度不确定的输入数据。
1
2
3
4
5
# 输入: "add Alice Bob Charlie done"
oper, *name, vf = input().split()
print(oper) # 输出: "add"
print(name) # 输出: ["Alice", "Bob", "Charlie"]
print(vf) # 输出: "done"
4. 嵌套解包
解包还可以用于嵌套结构,例如嵌套列表或元组。
1
2
3
4
5
6
data = [1, [2, 3], 4]
a, (b, c), d = data
print(a) # 输出: 1
print(b) # 输出: 2
print(c) # 输出: 3
print(d) # 输出: 4
5. 解包的注意事项
变量数量必须匹配:
如果变量数量少于序列中的元素数量,且没有使用 * 捕获多余元素,会抛出 ValueError。
例如:
1
a, b = [1, 2, 3] # ValueError: too many values to unpack
*只能使用一次:
在一个解包表达式中,*只能出现一次,否则会引发语法错误。
例如:
1
a, *b, *c = [1, 2, 3, 4] # SyntaxError: two starred expressions in assignment
*可以捕获空列表:
如果没有多余的元素,* 会捕获一个空列表。
例如:
1
2
a, *b, c = [1, 2]
print(b) # 输出: []
6. 解包的扩展用法
(1) 解包字典
使用 ** 可以将字典解包为关键字参数。
1
2
3
4
5
def greet(name, age):
print(f"Hello {name}, you are {age} years old.")
person = {"name": "Alice", "age": 25}
greet(**person) # 输出: Hello Alice, you are 25 years old.
(2) 合并列表或字典
解包可以用于合并列表或字典。
1
2
3
4
5
6
7
8
9
10
11
# 合并列表
list1 = [1, 2]
list2 = [3, 4]
merged_list = [*list1, *list2]
print(merged_list) # 输出: [1, 2, 3, 4]
# 合并字典
dict1 = {"a": 1, "b": 2}
dict2 = {"c": 3, "d": 4}
merged_dict = {**dict1, **dict2}
print(merged_dict) # 输出: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
- 总结 解包是 Python 中非常实用的特性,可以简化代码并提高可读性。
* 用于捕获多余元素,** 用于解包字典。
解包适用于函数参数传递、变量交换、处理不定长输入等场景。