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 引入了这种向后破坏行为。这样做的理由是什么?
这里有一个正式的讨论。我能找到的最相关的引用是:
当前的行为也允许
(*x), y = 1分配。如果(*x)是完全不允许,(*x), y = 1也应该拒绝。
我同意。
最后一句“我同意”来自 Guido van Rossum。
拒绝的理由(*x)是:
老实说,这对我来说似乎是 3.8 中的一个错误(如果它确实是这样的话):
Run Code Online (Sandbox Code Playgroud)>>> (*x), y (1, 2, 3)每次我错误地尝试 (*x) 时,我的真正意思是 (*x,),因此令人惊讶的是 (*x), y 会被解释为 (*x, y),而不是将 (*x) 标记为错误。
即使这是一个回归,也请不要“修复”这个问题。
吉多·范·罗森 (Guido van Rossum) 的作品也是如此。所以它似乎(*x)被拒绝了,因为它看起来与解包成单元组太相似。