2010-08-13 29 views
122

我觉得'解包'可能是错误的词汇 - 道歉,因为我确信这是一个重复的问题。在Python中解压列表?

我的问题很简单:在一个需要项目列表的函数中,如何传递一个Python列表项而不会出现错误?

my_list = ['red', 'blue', 'orange'] 
function_that_needs_strings('red', 'blue', 'orange') # works! 
function_that_needs_strings(my_list) # breaks! 

当然必须有展开列表的方式,并通过功能'red','blue','orange'的蹄?

+30

我的#1的抱怨与Python是仰视整齐的东西,如''操作的难度。 :) – 2010-08-13 19:43:26

+1

是啊,你会怎么知道如何提前做到这一点? – gtrak 2010-08-13 19:47:34

+1

如果您搜索“python apply”并阅读文档,它会指出那里的语法。 “apply”以这种方式用于多种语言。 – srparish 2010-08-13 19:53:56

回答

160
function_that_needs_strings(*my_list) # works! 

You can read all about it here.

+0

-1假设你的'csvfile'是'csv.writer'对象,''ow''方法只有一个arg。函数/方法调用中的'* args'只是编写'arg [0],arg [1],...'的简短方法。该函数或方法必须能够处理您提供的参数。 'args'不是覆盖函数/方法arg声明的voodoo。您的示例仅在“len(my_list)== 1”时“有效”。这是我见过一段时间的Gadarene高调的最糟糕的例子。 – 2010-08-13 21:31:49

+1

@John Machin:你错过了这个问题的关键。我刚刚从问题的第一个修订版中复制了这个函数 - 但我只是为了你而改变了它。 – 2010-08-13 22:41:41

+0

@ THC4k:我很清楚这个问题的重点。你从哪里复制你的答案的部分是无关紧要的。我的观点是你答案的第一句话是可笑的错误。 – 2010-08-13 23:04:27

15

是的,你可以使用*args(图示)语法:

function_that_needs_strings(*my_list) 

其中my_list可以是任何可迭代的; Python将遍历给定的对象,并将每个元素用作函数的单独参数。

查看call expression documentation

有相当于一个关键字参数以及使用两颗星:

kwargs = {'foo': 'bar', 'spam': 'ham'} 
f(**kwargs) 

并有equivalent syntax,用于在功能签名指定捕获所有参数:

def func(*args, **kw): 
    # args now holds positional arguments, kw keyword arguments