为什么python3.10中不允许这个解包表达式?

One*_*Day 6 python language-lawyer

我曾经像这样解压一个长可迭代表达式:

在Python 3.8.7中:

>>> _, a, (*_), c = [1,2,3,4,5,6]
>>> a
2
>>> c
6
Run Code Online (Sandbox Code Playgroud)

在Python 3.10.7中:

>>> _, a, (*_), c = [1,2,3,4,5,6]
  File "<stdin>", line 1
    _, a, (*_), c = [1,2,3,4,5,6]
           ^^
SyntaxError: cannot use starred expression here
Run Code Online (Sandbox Code Playgroud)

我不确定 3.8.7 和 3.10.7 之间哪个版本的 python 引入了这种向后破坏行为。这样做的理由是什么?

Car*_*ate 6

这里有一个正式的讨论。我能找到的最相关的引用是:

当前的行为也允许(*x), y = 1分配。如果(*x)是完全不允许,(*x), y = 1也应该拒绝。

我同意。

最后一句“我同意”来自 Guido van Rossum。

拒绝的理由(*x)是:

老实说,这对我来说似乎是 3.8 中的一个错误(如果它确实是这样的话):

>>> (*x), y (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

每次我错误地尝试 (*x) 时,我的真正意思是 (*x,),因此令人惊讶的是 (*x), y 会被解释为 (*x, y),而不是将 (*x) 标记为错误。

即使这是一个回归,也请不要“修复”这个问题。

吉多·范·罗森 (Guido van Rossum) 的作品也是如此。所以它似乎(*x)被拒绝了,因为它看起来与解包成单元组太相似。