我有点困惑。让我们创建一个名为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/iteratorsa
和b
,正确的方法是:
>>> 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')
如果
a
和b
都属于同一类型并且都是可接受的,那么您还可以使用:>>> a = [1, 2, 4]
>>> b = [0,1]
>>> func(*(a + b))
(1, 2, 4, 0, 1)
关于python - 令人困惑的python星号符号的双重用法(作为函数参数或函数定义),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18027042/