【问题标题】:Please explain the *elements,=iterable construct [duplicate]请解释 *elements,=iterable 构造[重复]
【发布时间】:2017-01-14 18:27:52
【问题描述】:

来自 PEP448:

虽然 *elements, = 可迭代导致元素成为列表,但元素 = *iterable,使元素成为一个元组。其原因可能会使不熟悉该构造的人感到困惑。

嗯,我就是其中之一。我试了一下:

>>> *e, = range(3)
>>> e
[0, 1, 2]

>>> e = *range(3),
>>> e
(0, 1, 2)

前者适用于 Python 3.4 和 3.5。

后者仅在 3.5 中。这是前面提到的 PEP448 引入的新功能。那个PEP里有描述,那个没问题。

但是,我以前从未见过*elements, = iterable。您能否解释一下它是如何工作的以及为什么要创建一个列表?

【问题讨论】:

标签: python python-3.x


【解决方案1】:

是的,这是一项新功能。好吧,这是因为需要解压列表的“其余部分”。所以,看一下例子:

>>> a, *e = range(3)
>>> print(a, e)
0 [1, 2]

>>> a, *e, b = range(3)
>>> print(a, e, b)
0 [1] 2

现在你的例子:

>>> *e, = range(3)
>>> print(e)
[0, 1, 2]

相当于:

>>> (*e,) = range(3)
>>> print(e)
[0, 1, 2]

所以逗号只是为了让它成为一个可迭代的元素(*e,)。所以python知道range(3)的“其余部分”应该放入e,在这种情况下[0, 1, 2]是整个值。

否则使用:

>>> *e = range(3)
  File "<stdin>", line 1
SyntaxError: starred assignment target must be in a list or tuple

它不起作用。

link下的其余解释。

【讨论】:

  • 谢谢。您没有回答为什么它会创建一个列表,但链接的 PEP3132 在规范部分中说明了它。
  • 我在关注主要问题:Please explain the *elements,=iterable construct。我会尽量回答,请稍等。
猜你喜欢
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
相关资源
最近更新 更多