【问题标题】: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 引入了两种新方法来浅拷贝列表,尽管这些方法已经存在。

标签: python python-3.x unpack


【解决方案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 时才会成功。
猜你喜欢
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 2011-07-24
  • 2014-08-04
  • 2021-01-03
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多