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

Python 当*x,y=[1,2,3,4]合法时,为什么*x=[1,2,3,4]无效?,python,Python,我想知道为什么下面的代码是无效的,我使用的是python3 *x =[1,2,3,4] 但是如果我再加一个变量 *x, y =[1,2,3,4] 代码是有效的,有人能解释一下吗? 感谢我的重点: 规格 简单赋值左侧的元组(或列表)(扩展赋值未定义解包)最多可包含一个以单个星号开头的表达式(此后称为“带星号”表达式) 使用星号表达式作为单独的赋值目标也是错误的,如 要执行上述操作,您必须执行a=list(range(5))(您必须转换为list以模拟解包,或者遵循生成的错误消息SyntaxE

我想知道为什么下面的代码是无效的,我使用的是python3

*x =[1,2,3,4]
但是如果我再加一个变量

*x, y =[1,2,3,4]
代码是有效的,有人能解释一下吗? 感谢我的重点:

规格

简单赋值左侧的元组(或列表)(扩展赋值未定义解包)最多可包含一个以单个星号开头的表达式(此后称为“带星号”表达式)

使用星号表达式作为单独的赋值目标也是错误的,如


要执行上述操作,您必须执行
a=list(range(5))
(您必须转换为list以模拟解包,或者遵循生成的错误消息
SyntaxError:starred赋值目标必须位于列表或元组中,do
[*a]=range(5)

星号分配目标必须是解包的一部分。它表示“获取此解包剩余部分未使用的项目,并将这些项目的列表分配给此分配目标”

当你这样做的时候

*x = [1, 2, 3, 4]
*x, y = [1,2,3,4]
*x
不是解包的一部分,因此这是无效的。如果将其作为解包的唯一元素:

*x, = [1, 2, 3, 4]
# or
[*x] = [1, 2, 3, 4]
那么它是有效的

引入语法的说明中提到了此限制:

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

*a = range(5)
但是,这是有效的语法:

*a, = range(5)

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

带星号的表达式需要位于元组或列表中,因为它的目的是获取其他变量未获取的所有值进行赋值。当您这样做时

*x = [1, 2, 3, 4]
*x, y = [1,2,3,4]
x&y对隐式地位于元组中,因此它可以工作

请注意,如果希望仅将x作为目标,则可以将其放入分配列表中:

[*x] = [1,2,3,4]
>*x=[1,3,4]
文件“”,第1行
SyntaxError:带星号的分配目标必须位于列表或元组中

正如上面所说,带星号的作业目标必须在列表或元组中。

@WillemVanOnsem:@user2357112:不。我对问题的解释是相反的,我的错。你希望
*x=[1,2,3,4]
做什么?为什么--这个语法会有什么效用?如果它没有效用,这是一个不定义它的参数--未定义的语法是以后可以引入扩展的空间;不必要地填充这个空间会使语言规范很难扩展。我不明白你为什么要加粗“调用列表中的其他表达式”部分强制“”。解包中实际上不强制包含其他表达式;“强制”意味着必须提供值以解包到任何未排序的分配目标。您可以拥有不包含其他分配目标的解包,如
[*x]=[1,2,3,4]
*x,=[1,2,3,4]