列表构造中的元组解包(Python3)

5

我希望在赋值语句的右侧使用元组解包:

>>> a = [3,4]

>>> b = [1,2,*a]
  File "<stdin>", line 1
SyntaxError: can use starred expression only as assignment target

当然,我可以做:

>>> b = [1,2]
>>> b.extend(a)
>>> b
[1, 2, 3, 4]

但我认为这很繁琐。我错过了什么吗?有更简单的方法吗?是否计划实现这个功能?或者明确没有将其包含在语言中的原因是什么?

问题的一部分在于所有容器类型都使用期望可迭代对象的构造函数,并且不接受*args参数。我可以创建子类,但是这会向脚本中引入一些非Python式的噪音,而其他人需要阅读。

4个回答

9

你可以使用加号运算符:

a = [3, 4]
b = [1, 2] + a

1
这就是那么简单。这上面没有任何问题。感谢你指出了显而易见的事情。叹气 - cfi

7
您有几个选择,但最好的选择是使用列表连接符(+):
b = [1,2] + a

如果您真的希望能够使用*语法,您可以创建自己的列表包装器:
def my_list(*args):
    return list(args)

然后你可以这样调用它:
a = 3,4
b = my_list(1,2,*a)

我想这里的好处在于a不必是一个列表,它可以是任何序列类型。


4
不,这并不是计划中的。*arg任意参数列表(以及**kw关键字参数映射)仅适用于Python调用调用(由*arg和**kw函数签名镜像),以及可迭代赋值的左侧。您可以简单地将这两个列表连接起来:
b = [10, 2] + a

3

此问题已在Python 3.5中得到解决,详见PEP 448

>>> a=[3,4]
>>> b=[1,2,*a]
>>> b
[1, 2, 3, 4]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接