为什么 *x=[1,2,3,4] 是无效的,而 *x,y=[1,2,3,4] 是合法的?

3
我想知道下面的代码为什么无效,我正在使用Python3。
*x =[1,2,3,4]

然而,如果我只是添加一个变量。
*x, y =[1,2,3,4]

代码是有效的,能否有人解释一下?谢谢。

@WillemVanOnsem: 你确定吗? - user2357112
@user2357112:不好意思,我把问题理解反了。 - Willem Van Onsem
3
你期望 *x = [1,2,3,4] 做什么? - njzk2
2
就“为什么”而言——这种语法有什么用处?如果没有用处,那就不要定义它——未定义的语法是以后可以引入扩展的空间;不必要地填充这个空间会使语言规范难以扩展。 - Charles Duffy
4个回答

8

星号赋值语句的目标必须是解包的一部分。它表示“获取未被其余解包消耗的项目,并将这些项目的列表分配给此赋值目标”。

当您执行以下操作时

*x = [1, 2, 3, 4]

*x不是拆包的一部分,因此这是无效的。如果你让它成为拆包的唯一元素:

*x, = [1, 2, 3, 4]
# or
[*x] = [1, 2, 3, 4]

那么它就是有效的。

引入该语法的PEP提到了这个限制:

It is also an error to use the starred expression as a lone assignment target, as in

*a = range(5)

This, however, is valid syntax:

*a, = range(5)

虽然他们可以将 *x = thing 定义为与 [*x] = thing 相同,但这将是一种没有实际好处的特殊情况。


3
根据文档,注意以下内容:
规范
在简单赋值的左侧(增强赋值不适用于解包)的元组(或列表)中,最多可以包含一个表达式,该表达式以单个星号开头(因此称为“带星号的”表达式)。
...
同时,将带星号的表达式用作唯一的赋值目标也是错误的。例如:
*a = range(5)

要执行上述操作,你需要执行 a = list(range(5))(你必须将其转换为列表以模拟解包,或者按照生成的错误消息 SyntaxError: starred assignment target must be in a list or tuple 执行 [*a] = range(5)


我不明白为什么你要将“列表中的其他表达式被称为‘强制性’”这部分加粗。实际上,在解包中没有其他表达式并不是必须的;“强制性”意味着必须提供值以解包到任何未加星号的赋值目标中。你可以有一个不包含其他赋值目标的解包,比如[*x] = [1, 2, 3, 4]*x, = [1, 2, 3, 4] - user2357112

3
星号表达式需要放在元组或列表中,因为它的目的是获取其他变量未分配的所有值。当您执行以下操作时:
*x, y = [1,2,3,4]

x和y配对时会被隐式地放在一个元组中,因此它能够正常运行。

请注意,如果你只想把x作为目标变量,你可以将其放在一个列表中进行赋值:

[*x] = [1,2,3,4]

-1
>>> *x = [1, 3, 4]
  File "<input>", line 1
SyntaxError: starred assignment target must be in a list or tuple

就像它所说的那样,星号赋值目标必须在列表或元组中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接