Skip to main content
 首页 » 编程设计

python之函数调用和*表达式

2025年05月04日14java哥

我对函数头中的参数规则和函数调用中的参数规则有些困惑。

这是我的困惑点:

根据文档:

If the syntax *expression appears in the function call, expression must evaluate to an iterable. Elements from this iterable are treated as if they were additional positional arguments; if there are positional arguments x1, ..., xN, and expression evaluates to a sequence y1, ..., yM, this is equivalent to a call with M+N positional arguments x1, ..., xN, y1, ..., yM.

所以如果有这样一个函数:

def func(a, *b): .... 

为什么我不能做这样的事情:

func(1, *[2, 3], *[4, 5]) 

这不是等同于 x1, ..., xN, y1, ..., yN, w1, ..., wN 吗? 为什么这行不通?

请您参考如下方法:

首先,不要对 *args 既可以用于函数声明也可以用于函数调用这一事实感到困惑。虽然两者有松散的联系,但它们不是一回事。您可以使用 foo(*args) 调用函数,而无需使用可变数量的参数声明它,并且不需要调用使用 def foo(*args) 定义的函数用一个解包的迭代器。

您看到的真正问题是函数调用中只允许一个 *args 解包。这就是指定 Python 语法的方式。不过,这可能会在未来发生变化,因为 PEP 448寻求概括解包语法,以便它可以在更多情况下使用。如果 PEP 获得批准和实现,像 foo(*args, *args2) 这样的函数调用将变得合法。