【python: 解包2】
你的理解很对,下面详细解答你的两个问题:
1. Python 的 * 解包适用哪些类型?
*user可以用于元组、列表,以及任何可迭代对象(如 set、range、字符串等)。- 只要这个对象可以被遍历,且元素个数和函数参数个数一致,都可以用
*解包。
示例:
def foo(a, b, c):
print(a, b, c)
# 用元组
t = (1, 2, 3)
foo(*t) # 输出: 1 2 3
# 用列表
l = [4, 5, 6]
foo(*l) # 输出: 4 5 6
# 用集合(set,注意集合是无序的)
s = {7, 8, 9}
foo(*s) # 输出: 7 8 9(顺序不保证)
# 用字符串
strs = "abc"
foo(*strs) # 输出: a b c
2. ** 字典解包举例
**dict用于关键字参数解包,要求字典的 key 必须和函数参数名一致。
示例:
def bar(name, age, gender):
print(f"姓名: {name}, 年龄: {age}, 性别: {gender}")
d = {"name": "张三", "age": 18, "gender": "男"}
bar(**d)
# 输出: 姓名: 张三, 年龄: 18, 性别: 男
注意:
- 如果字典 key 和函数参数名不一致,会报错。
- 你也可以同时用 * 和 **,比如:
def baz(a, b, c, d=0): print(a, b, c, d) args = (1, 2) kwargs = {"c": 3, "d": 4} baz(*args, **kwargs) # 输出: 1 2 3 4
总结
*可用于任何可迭代对象的解包(元组、列表、集合等)。**用于字典的关键字参数解包,key 必须和参数名一致。- 这两种解包方式是 Python 非常常用且强大的语法。
3. 字典解包只能用于函数调用
>>> d = {"name": "张三", "age": 18, "gender": "男"}
>>> print(**d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'name' is an invalid keyword argument for print()
**d只能用于函数调用,并且目标函数必须支持这些关键字参数。print()函数的参数名并不是name、age、gender,所以会报错。
正确用法举例
1. 用于自定义函数
def show(name, age, gender):
print(name, age, gender)
d = {"name": "张三", "age": 18, "gender": "男"}
show(**d) # 正确,输出: 张三 18 男
2. 用于 print() 的正确方式
如果你想把字典内容打印出来,可以直接:
print(d) # 输出: {'name': '张三', 'age': 18, 'gender': '男'}
或者:
print(*d.values()) # 输出: 张三 18 男
但不能用 print(**d),因为 print 并不接受 name、age、gender 这些关键字参数。
总结
**d只能用于参数名和目标函数参数完全一致的情况。- 用于 print() 这种内置函数时,通常直接传值或用 *d.values()。

浙公网安备 33010602011771号