不明白为啥拆包没有按预期工作

Posted

技术标签:

【中文标题】不明白为啥拆包没有按预期工作【英文标题】:Don't understand why unpacking is not working as expected不明白为什么拆包没有按预期工作 【发布时间】:2019-03-24 09:57:15 【问题描述】:

Python 解包不起作用

a = [1,2,3,4]
*m = a; //error

b,*m = a
print(m) //working

请解释为什么前一个不起作用。

【问题讨论】:

如果*m 有效,它只会复制列表并且已经有语法。 如果您将*m = a; //error(由于Python 中的cmets 以# 开头而导致语法不正确)更改为*m = a #error,则会出现另一个语法错误来解释问题:SyntaxError: starred assignment target must be in a list or tuple。在这种情况下,您可以只使用m = a[:] 来获取所有a 的副本。 @SuperShoot 公平地说,多个选项用于浅拷贝列表,包括:m = a[:]m = a.copy()m = copy.copy(a)m = list(a)m = [x for x in a],是的,*m, = a @jonrsharpe 正确,*m 不是其中之一。 @SuperShoot 这是真的,但不是你的论点。该 PEP 引入了两种新方法来浅拷贝列表,尽管这些方法已经存在。 【参考方案1】:

根据PEP-3132,它引入了这种“扩展的可迭代解包”语法,以及language reference,“加星标”目标仅在目标是可迭代的赋值中有效。

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

*a = range(5)

然而,这是有效的语法:

*a, = range(5)

因此,要使其在语法上有效,您可以这样做:

*m, = a

甚至:

[*m] = a

但请注意,创建列表的浅表副本的惯用方法是使用切片:

m = a[:]

【讨论】:

*a, = range(5) 这里的逗号是什么意思? @user9580899 将其分配给可迭代的目标列表,其中加星标的目标是有效的语法。 一般来说,一个表达式后面的逗号会将它变成一个元组。如果没有星号,它将是一个单元素元组,解包将失败。 @DanielH true, m, = a[m] = a 只有在 len(a) == 1 时才会成功。

以上是关于不明白为啥拆包没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 SUM() 字段没有按预期工作?

为啥脚手架没有按预期工作?

为啥响应式表没有按预期工作?

为啥我的替换没有按预期工作[重复]

为啥我的查询没有按预期工作?

为啥我的 javascript 代码没有按预期工作