在 Python 中使用 *args 时出现类型错误

TypeError while using *args in Python

我在多参数函数中使用元组时遇到类型错误。这是我的代码:

def add(*args):
    result = 0
    for x in args:
        result = result + x
    return result

items = 5, 7, 4, 12
total = add(items)
print(total)

这是错误:

Traceback (most recent call last):
  File "e:\functions.py", line 9, in <module>
    total = add(items)
  File "e:\functions.py", line 4, in add
    result = result + x
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

如果我直接输入参数而不是使用变量,我不会收到任何错误:

total = add(5, 7, 4, 12)

我已经在 Java 中编码,我刚开始使用 Python,但我不明白为什么会这样。

您将元组 items 作为单个参数传递给 add,它被编写为期望任意数量的单个数字参数而不是单个可迭代参数(这就是 *args 语法确实如此——它接受任意数量的参数并将它们转换为函数内部的可迭代对象。

TypeError 发生是因为您的 for x in args 正在获取 items 的值作为其 x 的第一个值(因为它是第一个参数),因此你的函数正在尝试执行操作 0 + (5, 7, 4, 12),这是无效的,因为你不能将 int 添加到 tuple(这就是错误消息这么说的原因)。

要将单个项目作为单个参数传递,请执行:

total = add(5, 7, 4, 12)

或者通过在调用者中镜像 * 语法来解压缩元组,如下所示:

total = add(*items)

请注意,Python 有一个名为 sum 的内置函数,它将完全按照您想要对元组执行的操作进行操作:

total = sum(items)

通过从函数定义中的 *args 中删除 *,您可以从 add 函数中获得相同的行为。

当你这样做的时候。

items = 5, 7, 4, 12 #tuple & it looks like this (5,7,4,12)
total = add(items)

您将 items 变量传递给 add 函数,一般情况下它看起来像这样。

total = add((5,7,4,12))#Not like this add(5,7,4,12)

嗯...这是正确的,没有任何问题,但根据您的 objective,这不是正确的方法。在此处了解有关 *args 的更多信息。

这是您期望做的事情,您可以按照其他答案的建议通过 unpacking 来做到这一点。

add(5,7,4,12)

因为你所做的是你传递了整个元组所以你的 args 参数看起来像这样 ((5,7,4,12)) & 当你做一个 for 循环时你是 iterating 元组(它是 args) 对象的值,即这个 (5,7,4,12) 然后将其添加到 int 中,这显然是所述的错误。

TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
def add(*args):
    result = 0
    for x in args:
        result = result + x
    return result

items = 5, 7, 4, 12
total = add(*items)
print(total)

只需在total = add(*items)

中添加一个随机*

结果:

28

What does ** (double star/asterisk) and * (star/asterisk) do for parameters?

What does asterisk * mean in Python? [duplicate]