Python中*在解包操作与可变参数中的作用及赋值报错疑问
Python中*在解包赋值与函数可变参数中的不同角色
一、赋值语句里的解包操作
在赋值场景中,*的作用是收集序列中未被单个变量匹配到的剩余元素,核心规则有两个:
- 被
*修饰的变量必须嵌套在列表或元组形式的赋值目标里,比如a, *b = (1,2,3)(赋值目标是元组(a, *b)),或是[*b] = (1,2,3) - 收集得到的结果是列表类型,所以你运行
a, *b = (1,2,3)会得到b = [2,3]
你尝试*args=[1,2]报错,就是因为违反了第一个规则——单独的*args不是列表/元组形式的赋值目标,正确写法可以是*args, = [1,2](末尾的逗号让目标变成元组),或者[*args] = [1,2],这样就能正常把[1,2]收集到args里(结果仍是列表)。
二、函数定义中的可变参数(*args)
在函数定义里,*的作用是收集调用时传入的多余位置参数,和赋值解包的核心区别在于:
- 它会把收集到的参数打包成元组类型,而非列表。这是Python的设计选择——元组不可变,能避免函数内部意外修改参数集合,更符合参数传递的安全性要求
- 比如你写的
def func(a, *args): ...,调用func(1,2,3)时,args会被赋值为(2,3),所以print(type(args))会输出<class 'tuple'> - 如果定义
def func(*args): ...,就是收集所有传入的位置参数,同样打包成元组
两者结果类型不同的原因
你之前误以为函数参数匹配等同于a, *args = 1,2,3,这个逻辑接近但有本质区别:赋值解包的*是为了生成可修改的列表,适配赋值场景的可变需求;而函数可变参数的*是为了生成不可变的参数集合,适配函数参数传递的安全需求,Python针对两种场景做了不同实现。
内容的提问来源于stack exchange,提问作者stayfish
相关产品推荐
相关产品推荐

