参数解包:使用*args时如何避免传入列表变为嵌套列表
问题根源
- 你定义函数时用了
*args形参,它会把所有传入的位置参数打包成一个元组。当你直接传入other_func(3)返回的列表时,args的实际值是([12,322,32],)——也就是整个列表作为元组的第一个元素存在,而非元组的元素是列表里的数字。 - 用
sorted(args)时,相当于对只有一个列表元素的元组排序,自然返回嵌套列表;用sort()方法时,因为args是元组,元组没有内置的sort()方法,所以抛出属性错误。 - 额外注意:
list.sort()是原地修改方法,没有返回值,就算你把元组转成列表,直接写result = num_list.sort()得到的结果会是None,需要先调用sort方法,再返回列表本身。
解决方案
方案1:保留args写法(适合学习args机制的场景)
在传参时给other_func(3)加*前缀,把返回的列表拆成独立元素传入,args就会变成包含所有数字的元组:
# sorted版本写法 def biggest_gap(*args): return sorted(args) # 调用时对返回的列表解包 print(biggest_gap(*other_func(3))) # 输出 [12, 32, 322]
如果要使用sort()方法实现,需要先把元组转成可变的列表再操作:
def biggest_gap(*args): num_list = list(args) num_list.sort() return num_list print(biggest_gap(*other_func(3)))
方案2:修改函数形参(适合实际生产场景)
如果你本身就是要接收一个完整列表作为参数,直接去掉*args改用普通形参即可,不需要额外解包操作:
def biggest_gap(num_list): return sorted(num_list) # 直接传入other_func返回的列表即可 print(biggest_gap(other_func(3)))
内容的提问来源于stack exchange,提问作者saZ
相关产品推荐
相关产品推荐

