Python 3: 使用星号表达式解包列表

56

使用示例:

def f(a, b, c, d): 
    print(a, b, c, d, sep = '&')

f(1,2,3,4)
>>> 1&2&3&4

f(*[1, 2, 3, 4])
>>> 1&2&3&4

在Python文档中,哪里详细解释了*这个符号?


2
相关问题:https://dev59.com/0mw05IYBdhLWcg3w41sp - Lev Levitsky
2
语言参考的相关部分在这里:http://docs.python.org/dev/reference/expressions.html#calls。查找以“如果语法*expression出现在函数调用中”开头的句子。 - Mark Dickinson
2
这里有一个很好的解释:https://dev59.com/wG435IYBdhLWcg3wvyw5 - Alex W
2个回答

64
*args 的调用约定在 表达式参考文档 中有详细说明:

如果函数调用中出现语法 *expression,那么 expression 必须评估为可迭代对象。来自此可迭代对象的元素被视为附加的位置参数;如果存在位置参数x1, ..., xN,并且 expression 评估为序列 y1, ..., yM,则这相当于使用 M+N 个位置参数 x1, ..., xN, y1, ..., yM 进行调用。

因此,由于您使用了可迭代对象[1, 2, 3, 4],并且没有其他位置参数,它被视为具有 M=0 和 N=4 的调用,总共有 4个位置参数。

因此,您还可以使用 f(1, 2, *[3, 4]) 或其他任何可迭代和位置参数的组合进行调用,前提是可迭代对象位于位置参数之后。


8

这里简单地补充一下无名参数和命名参数的组合。

你需要记住的一般顺序如下:

def func(arg_1, ..., arg_N, *args, kwarg_1, ..., kwarg_M, **kwargs):
    # do stuff
    return True

在大多数典型情况下:

  • 每个单独的arg_i是一个未命名的参数,
  • args是一个列表,因此是一组未命名的参数,
  • 每个单独的kwarg_j是一个带有名称的参数,
  • kwargs是一个字典,因此是一组带有名称的参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接