当* x,y = [1,2,3,4]合法时,为什么* x = [1,2,3,4]无效?

时间:2017-03-22 16:01:13

标签: python

我想知道为什么以下代码无效,我正在使用python3

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

但是,如果我只添加一个变量

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

代码有效,有人可以解释一下吗? 感谢

4 个答案:

答案 0 :(得分:7)

已加星标的作业目标必须是拆包的一部分。它代表"获取其余解包所未消耗的项目,并将这些项目的列表分配给此分配目标"。

当你这样做时

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

*x不是解包的一部分,因此无效。如果你把它作为解包的唯一元素:

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

然后它才有效。

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

  

将已加星标的表达式用作单独的赋值也是错误的   目标,如

*a = range(5)
     

然而,这是有效的语法:

*a, = range(5)

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

答案 1 :(得分:3)

来自documentation,强调我的:

  

规范

     

简单赋值左侧的元组(或列表)(未为扩充赋值定义解包)最多可包含一个前缀为单个星号的表达式(此后称为“已加星标”表达式

...

  

将已加星标的表达式用作单独的分配目标也是错误的,如

*a = range(5)

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

答案 2 :(得分:2)

已加星标的表达式需要位于元组或列表中,因为它的目的是将所有未被其他变量抓取的值用于赋值。当你这样做

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

x& y对隐含在一个元组中,所以它有效。

请注意,如果您希望将x单独作为目标,则可以将其放在列表中进行分配:

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

答案 3 :(得分:0)

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

就像说的那样,已加星标的分配目标必须在列表或元组中。