不明白为啥拆包没有按预期工作
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
时才会成功。以上是关于不明白为啥拆包没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章