Python中*args函数不同传参方式导致结果差异的问题咨询
为什么两次调用
multiply_all的结果不同? 首先得搞懂*args的作用:定义函数时用*args,是用来接收任意数量的位置参数,并把这些参数打包成一个元组。
现在看你的两种调用方式:
第一种:
x = multiply_all(test_1)test_1本身是一个元组(1,4,3,10),你直接把它作为一个参数传给函数,这时候args就变成了包含这个元组的元组——也就是((1,4,3,10),)。
函数里循环遍历args,第一次循环i就是这个元组,m *= i相当于m = 1 * (1,4,3,10),在Python里整数乘元组是重复元组,结果还是(1,4,3,10),循环结束后返回这个元组,所以第一个print(x)会输出(1, 4, 3, 10)。第二种:
multiply_all(1,4,3,10)
这里你传入了4个单独的位置参数,args会直接把这四个参数打包成元组(1,4,3,10)。
循环遍历每个元素依次相乘:14=4,43=12,12*10=120,所以返回120,第二个print输出120。
如果想让第一种调用和第二种结果一致,需要在传参时用*解包元组,把元组里的元素拆成单独的位置参数传给函数:
x = multiply_all(*test_1)
这样args就会变成(1,4,3,10),最终返回120。
内容的提问来源于stack exchange,提问作者Shashi Bala
相关产品推荐
相关产品推荐

