我有一个定义如下的函数:
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
与之间的行为会发生变化?
答案 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;)相同。