【问题标题】:Tuple unpacking in list construction (python3)列表构造中的元组解包(python3)
【发布时间】:2012-09-11 16:21:38
【问题描述】:

我很想在作业的右侧使用元组解包:

>>> 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 的噪音。

【问题讨论】:

    标签: python python-3.x python-3.2 iterable-unpacking


    【解决方案1】:

    您可以使用添加运算符:

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

    【讨论】:

    • 就这么简单。对此没有任何疑问。感谢您指出显而易见的。 叹息
    【解决方案2】:

    您有几个选择,但最好的选择是使用列表连接 (+):

    b = [1,2] + a
    

    如果您真的希望能够使用* 语法,您可以创建自己的列表包装器:

    def my_list(*args):
        return list(args)
    

    那么你可以这样称呼它:

    a = 3,4
    b = my_list(1,2,*a)
    

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

    【讨论】:

      【解决方案3】:

      不,这不是计划中的。 *arg 任意参数列表(和**kw 关键字参数映射)仅适用于python call invocations(由*arg and **kw function signatures 镜像)和iterable assignment 的左侧。

      您可以简单地连接两个列表:

      b = [10, 2] + a
      

      【讨论】:

        【解决方案4】:

        这已在 Python 3.5 中得到修复,如 PEP 448 中所述:

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

        【讨论】:

          猜你喜欢
          • 2014-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-22
          • 2021-07-18
          • 1970-01-01
          相关资源
          最近更新 更多