问题的提出
有一个python的小例子
def test(a1,*a2):
print(a1)
print(a2)
n1='hello'
n2=[1,2,3]
test(*n2,n1)
结果如下
1
(2, 3, 'hello')
从结果上看,在函数test的调用过程中,a1的值为 1,a2是一个列表,值为 (2, 3, ‘hello’)
为什么会这样呢?
带*号参数的使用分析
在定义函数参数时,参数前带有星号,说明这个参数是一个列表参数,而在实际调用时,有两种提供参数的方式
1 ,用逗号分隔的参数列表
2,实参是一个列表,则前面要带上星号,如果不带星号,则将整个列表做为一个实际参数传入。
用以下的实验说明一下:
def test(*a):
print(a)
n=[1,2,3]
test(*n)
test(n)
结果如下
(1, 2, 3)
([1, 2, 3],)
可见在列表 n 的前面加上星号传入时,参数a 的值就是列表(1,2,3),而不带星号传入时,参数a的值仍然是列表,不过其值是含有一个元素的列表,而这唯一的元素是一个列表(1,2,3)。
知识点:在实际参数前加上了星号,其作用等价于将列表打散成多个元素。
用下面的实验说明一下:
def test(*a):
print(a)
n=[1,2,3]
test(*n)
test(1,2,3)
结果如下
(1, 2, 3)
(1, 2, 3)
可见test(*n) 与 test(1,2,3) 的效果是等价的。
有了以上的认识,再回过头来看前面提出的问题
def test(a1,*a2):
print(a1)
print(a2)
n1='hello'
n2=[1,2,3]
test(*n2,n1)
结果如下
1
(2, 3, 'hello')
问题的解决:
由于 test(*n2,n1) 等价于 test(1,2,3 ‘hello’),而test函数的第1个参数 a1是一个普通的形参,与 1 结合。第2个参数是一个列表,与剩下的 2,3,'hello’结合,形成一个列表(2,3,‘hello’)。
补充说明,带两个星号的参数的使用分析,请参见文章