我有点困惑。让我们创建一个名为x的函数,我知道把*放在y前面,这意味着我们可以添加任意多的参数。

def x(*y):
    return y

然而。
案例1:
>>> x(1, 2)
(1, 2)

案例2:
让我们传递一个前面带星号的列表[1,2]:
>>> x(*[1,2])
(1, 2)

似乎单个星号有两个用途:
在函数中允许多个参数-本质上是将它们放入一个列表中
如果重复两次,则将列表“分解”为单独的项
这是为什么?为什么我不能做像:*a*b这样的事情?

最佳答案

在函数定义中*用于收集元组中的所有位置参数,在函数调用中*解压iterable并将其项作为位置参数传递。
如果您试图通过*a*b解包两个iterable/iteratorsab,正确的方法是:

>>> a = [1, 2, 4]
>>> b = 'foo'
>>> from itertools import chain
def func(*x):
    print x
...
>>> func(*chain(a,b)) #chain will work for both iterators and iterables
(1, 2, 4, 'f', 'o', 'o')

如果ab都属于同一类型并且都是可接受的,那么您还可以使用:
>>> a = [1, 2, 4]
>>> b = [0,1]
>>> func(*(a + b))
(1, 2, 4, 0, 1)

关于python - 令人困惑的python星号符号的双重用法(作为函数参数或函数定义),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18027042/

10-11 15:21
查看更多