Python 使用*args时传递参数

Python 使用*args时传递参数,python,Python,我有一个这样定义的函数: def foo(arg1, *args): print type(args), args 有人能解释一下通过以下两种方式传递expectedResults调用foo的区别吗: expectedResults = ['RESULT1', 'RESULT2'] foo(res, expectedResults) 打印以下内容 <type 'tuple'> (['RESULT1', 'RESULT2'],) 我明白了 <type 'tuple'

我有一个这样定义的函数:

def foo(arg1, *args):
    print type(args), args
有人能解释一下通过以下两种方式传递
expectedResults
调用
foo
的区别吗:

expectedResults = ['RESULT1', 'RESULT2']
foo(res, expectedResults)
打印以下内容

<type 'tuple'> (['RESULT1', 'RESULT2'],)
我明白了

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

我的问题是:为什么在传递
expectedResults
时不带星号,而传递的是with

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

所以

相当于

foo(res, 'RESULT1', 'RESULT2')
foo(res, ['RESULT1', 'RESULT2'])
将两个字符串都放入*args参数中,然后

foo(res, expectedResults)
相当于

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

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

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

所以

相当于

foo(res, 'RESULT1', 'RESULT2')
foo(res, ['RESULT1', 'RESULT2'])
将两个字符串都放入*args参数中,然后

foo(res, expectedResults)
相当于

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

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

当您有*args时,该方法将自动从参数中创建一个列表,因此即使您向其传递一个列表,它也只会将整个列表插入到元组中(因此您在参数中有一个元素,即list expectedResults)。当您使用asterix传递参数时,您将传递列表中的参数


所以foo(res,expectedResults)与传递res,['RESULT1','RESULT2'](然后可以发送多个列表)相同,而foo(res,*expectedResults)与传递foo(res,'RESULT1','RESULT2')相同

当您有*args时,该方法将自动从参数中创建一个列表,因此,即使您向其传递一个列表,它也只会将整个列表插入到元组中(因此您在args中有一个元素,即list expectedResults)。当您使用asterix传递参数时,您将传递列表中的参数

所以foo(res,expectedResults)与传递res,['RESULT1','RESULT2'](然后可以发送多个列表)相同,而foo(res,*expectedResults)与传递foo(res,'RESULT1','RESULT2')相同