使用*args时传递参数

2024-05-18 23:44:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

有人能解释一下通过以下两种方式传递expectedResults来调用foo的区别吗:

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

打印以下内容

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

当传递带有星号的expectedResults

foo(res, *expectedResults)

我明白了

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

我的问题是:为什么在传递expectedResults时不加星号,而传递with时行为会发生变化


Tags: 函数定义foodeftype方式argsres
2条回答

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

所以呢

foo(res, *expectedResults)

相当于

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

将两个字符串都放入*args参数中,然后

foo(res, expectedResults)

相当于

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

将列表放在*args参数中

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

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

相关问题 更多 >

    热门问题