为什么python在函数和表达式中会区别对待星号?

时间:2018-10-21 17:33:01

标签: python python-3.x function

在以下代码中,有两个使用星号(*)的地方:

星号功能

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 而不管表达式中分配的数字类型如何?

最后,那些*是不同的运算符吗?!

2 个答案:

答案 0 :(得分:4)

开发人员刚刚发现,在分配情况下,列表将更易于处理。用a, *b = ...语法引用PEP

  

在python-3000列表[1]上的简短讨论之后,PEP被Guido接受为当前形式。讨论的可能更改是:

     
      
  • ...

  •   
  • 使已加星标的目标为元组而不是列表。这将与函数的* args一致,但使结果的进一步处理变得更加困难。

  •   

还有mailing list discussion

  

IMO,您可能希望进一步处理结果   顺序,包括对其进行修改。

邮件列表讨论非常简短(starts here,只有28条消息),所以不要害怕阅读整个内容。

答案 1 :(得分:1)

分配中的解包(特定于python 3)为extended iterable unpacking(当解包术语指的是右侧时,左侧*之后的变量一侧不是解压缩,而是 created ),而另一侧(在python 2中也可用)只是位置参数解压缩。

在两种情况下,*“运算符”都非常不同。扩展可迭代拆包会创建list的事实可能是为了使调用者可以扩展该列表而设计的。

在参数解压缩中,最好有一个固定的迭代器,例如tuple。这些又是完全不同的机制。