【发布时间】:2017-05-06 05:23:46
【问题描述】:
PEP 448 -- Additional Unpacking Generalizations 允许:
>>> LOL = [[1, 2], ['three']]
>>> [*LOL[0], *LOL[1]]
[1, 2, 'three']
好的!再见itertools.chain。反正从不喜欢你。
>>> [*L for L in LOL]
File "<ipython-input-21-e86d2c09c33f>", line 1
[*L for L in LOL]
^
SyntaxError: iterable unpacking cannot be used in comprehension
哦。为什么我们不能拥有美好的事物?
不幸的是,它们都存在语法错误:
[*l for l in lists] # for l in lists: result.extend(l)
{*s for s in sets} # for s in sets: result.update(s)
{**d for d in dicts} # for d in dicts: result.update(d)
(*g for g in gens) # for g in gens: yield from g
在推导式中解包似乎是显而易见的和 Python 式的,并且从简写“for-loop & append”到“for-loop & extend”有一个非常自然的扩展。
但由于他们费心添加该特殊错误消息,因此禁用它可能是有原因的。那么,这种语法有什么问题呢?
【问题讨论】:
-
你添加第二个循环:
[item for L in LOL for item in L]可能是为了消除关于应该使用哪个循环的歧义。 -
这还没有被排除在未来(最初的实现有据我所知),寻找这方面的参考。
-
P.s 你的命名约定是可怕的!
-
@wim
[item for L in LOL for item in L[:3]]
标签: python python-3.x list-comprehension python-3.5 iterable-unpacking