在以下代码中,有两个使用星号(*)的地方:
星号功能
def function(*asterisk):
print(1, type(asterisk))
表达式中的星号
a, *b = (1, 2, 3)
print(2, type(b))
a, *b = [1, 2, 3]
print(3, type(b))
我知道星号在函数中的含义及其工作原理。
我的问题是,为什么印刷品1中的星号具有元组类型,而印刷品2和3中的星号具有列表类型?
为什么python不管参数的类型如何将函数* parameter解释为 tuple ,而将变量**解释为 list 而不管表达式中分配的数字类型如何?
最后,那些*是不同的运算符吗?!
答案 0 :(得分:4)
开发人员刚刚发现,在分配情况下,列表将更易于处理。用a, *b = ...
语法引用PEP:
在python-3000列表[1]上的简短讨论之后,PEP被Guido接受为当前形式。讨论的可能更改是:
...
使已加星标的目标为元组而不是列表。这将与函数的* args一致,但使结果的进一步处理变得更加困难。
IMO,您可能希望进一步处理结果 顺序,包括对其进行修改。
邮件列表讨论非常简短(starts here,只有28条消息),所以不要害怕阅读整个内容。
答案 1 :(得分:1)
分配中的解包(特定于python 3)为extended iterable unpacking(当解包术语指的是右侧时,左侧*
之后的变量一侧不是解压缩,而是 created ),而另一侧(在python 2中也可用)只是位置参数解压缩。
在两种情况下,*
“运算符”都非常不同。扩展可迭代拆包会创建list
的事实可能是为了使调用者可以扩展该列表而设计的。
在参数解压缩中,最好有一个固定的迭代器,例如tuple
。这些又是完全不同的机制。