我想知道为什么以下代码无效,我正在使用python3
*x =[1,2,3,4]
但是,如果我只添加一个变量
*x, y =[1,2,3,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
就像说的那样,已加星标的分配目标必须在列表或元组中。