首页 > 解决方案 > 如何将解包迭代器作为参数传递给函数?

问题描述

我有一个关于在函数中传递参数的问题。在 python 中,当你想在右侧解压一个可迭代的 obj 时,你必须在某些上下文中进行,比如元组或集合等。例如,你不能说:

a, b = *(1, 2)

你应该说:

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

或者你可以说:

a, b = {*(1, 2)} //a=1, b=2 or a=2, b=1

我说得对吗?

但是,当您想解压可迭代对象并将其作为参数传递给函数时,您根本不需要任何上下文,只需解压可迭代对象即可。例如:

def f(param1, param2):
     pass
f(*(1, 2))  

而且您不需要像以前那样使用某种上下文。例如,您不说:

f({*(1, 2)}) // it will be f({1, 2})

我认为在这种情况下我们不使用 {} 或任何其他上下文,因为我们正在寻找传递 2 个值作为 f 函数中的参数。因此,我认为我们不得不说f(*(1, 2))not f({*(1, 2)})

如果我是对的,您能否详细解释一下 f(*(1, 2)) 是如何在不使用任何上下文的情况下工作的?

标签: python

解决方案


f(*(1, 2))确实有上下文!上下文是函数参数本身的列表(和字典)。本质上,在函数调用f(...)中,括号之间的内容可以看作是元组和字典文字之间的混合体(仅使用x=4而不是'x': 4),然后将其传递给函数:

>>> def f(*args, **kwargs):
...     print(args, kwargs)
>>> l = [10, 11]; d = {'a': 12, 'b': 13}
>>> f(1, *l, 2, 3, x=4, y=5, **d, z=6)
(1, 10, 11, 2, 3) {'x': 4, 'y': 5, 'a': 12, 'b': 13, 'z': 6}

这样看来,您可以将序列和字典解包到此上下文中,这是非常有意义的。


推荐阅读