使用* args时传递的参数

时间:2015-07-08 12:12:11

标签: python

我有一个定义如下的函数:

def foo(arg1, *args):
    print type(args), args

有人可以通过以下两种方式传递foo来解释调用expectedResults之间的区别:

expectedResults = ['RESULT1', 'RESULT2']
foo(res, expectedResults)

打印以下内容

<type 'tuple'> (['RESULT1', 'RESULT2'],)

使用带有星号的expectedResults传递

foo(res, *expectedResults)

我明白了

<type 'tuple'> ('RESULT1', 'RESULT2')

我的问题是:为什么在没有星号的情况下传递expectedResults与之间的行为会发生变化?

2 个答案:

答案 0 :(得分:3)

*expectedResults在发送内容之前解压缩列表 这就像说foo(res, 'RESULT1', 'RESULT2'),而foo(res, expectedResults)只是将列表本身作为1个参数传递,从而产生一个包含1个元素的元组。

所以

foo(res, *expectedResults)

相当于

foo(res, 'RESULT1', 'RESULT2')

将两个字符串放在* args参数和

foo(res, expectedResults)

相当于

foo(res, ['RESULT1', 'RESULT2'])

只将列表放在* args参数中。

答案 1 :(得分:1)

当你有* args时,方法会自动从参数中创建一个列表,所以即使你传递一个列表它只会将整个列表插入到tupple中(所以你在args中有一个元素,列表预期成绩)。当您使用星号传递参数时,您会传递列表中的内容。

所以foo(res,expectedResults)与传递res,[&#39; RESULT1&#39;,&#39; RESULT2&#39;](然后你可以发送多个列表)相同,而foo(res) ,* expectedResults)与做foo(res,&#39; RESULT1&#39;,&#39; RESULT2&#39;)相同。