元组作为函数参数

新手上路,请多包涵

a tuple 在 python 中(在代码块中)由逗号定义;括号不是强制性的(在以下情况下)。所以这三个都是等价的:

 a, b = 1, 2
a, b = (1, 2)
(a, b) = 1, 2

如果我定义一个函数

def f(a, b):
    print(a, b)

以这种方式调用它会起作用:

 f(2, 3)

这不会:

 f((2, 3))
# TypeError: f() missing 1 required positional argument: 'b'

当元组是函数参数时,python 如何区别对待它们?这里的括号是必要的(我理解 为什么 会这样,我很高兴 python 以这种方式工作!)。

我的问题是:当元组是函数参数时,python 如何区别对待它们。

原文由 hiro protagonist 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 670
2 个回答

为方便起见,Python 根据赋值语句的需要构造了一个临时元组。因此,一旦到达数据移动,您的所有三个赋值语句就完全相同。

函数调用不是赋值语句;这是一个参考映射。因此,语义不同。

如果您希望 Python 将您的元组解压缩为两个单独的参数,请使用 * 运算符:

 f(*(2, 3))

原文由 Prune 发布,翻译遵循 CC BY-SA 4.0 许可协议

元组的行为类似于不可变列表。 用圆括号标记它们的事实可能令人困惑,但这或多或少是巧合 - 因为圆括号用于将事物组合在一起并减少歧义。

当你调用一个函数时,你并没有提供一个元组。你在提供论据。元组 可以是 一个参数,但只能是一个——它只是一个类型为 tuple 的变量。

您可以做的是 元组(或列表)扩展为一系列具有以下表示法的参数:

 tup = (2, 3)
f(*tup)
# expand the tuple (2,3) into a series of arguments 2, 3

你也可以用字典来做到这一点,除了 ** 而不是 *

 my_dict = {"arg1": 1, "arg2": 2}
f(arg1=my_dict["arg1"], arg2=my_dict["arg2"])
f(**my_dict)   # these are equivalent


另一方面,函数可以采用任意数量的参数(类似于其他语言对 printf() 调用的处理方式)。例如:

 def g(*args):
    print("I got this many arguments:", len(args))

在这里,如果你做 type(args) ,你会得到 tuple ,如果你做 type(*args) ,你会得到一个错误。这是因为,在函数头中, * 做的恰恰相反:它将提供给函数的参数打包到一个元组中,以便您可以使用它们。考虑以下:

 g(2, 3)  # 2 arguments, both integers
g((2, 3)) # 1 argument, a tuple
g(*(2, 3)) # 2 arguments, both integers

简而言之,

  • 函数的构建方式是它们接受任意数量的参数
  • *** 运算符能够在一端将元组/列表/字典 解包 为参数,并在另一端将它们 打包
  • 单独的元组/列表/字典在其他方面只是单独的变量。

原文由 Green Cloak Guy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题