Python就地解包不需要';似乎没有如预期的那样工作

Python就地解包不需要';似乎没有如预期的那样工作,python,python-2.7,Python,Python 2.7,关于在元组之前使用*将其扩展为其他内容,我在这里看到了很多问题,但它似乎不适合我 >>> l1 = (1, 2, 3) >>> l2 = (0, l1, 4) >>> l2 (0, (1, 2, 3), 4) >>> l2 = (0, *l1, 4) File "<stdin>", line 1 l2 = (0, *l1, 4) ^ SyntaxError: in

关于在元组之前使用
*
将其扩展为其他内容,我在这里看到了很多问题,但它似乎不适合我

>>> l1 = (1, 2, 3)
>>> l2 = (0, l1, 4)
>>> l2   (0, (1, 2, 3), 4)
>>> l2 = (0, *l1, 4)
File "<stdin>", line 1  
    l2 = (0, *l1, 4)  
             ^   SyntaxError: invalid syntax 
l1=(1,2,3) >>>l2=(0,l1,4) >>>l2(0,(1,2,3),4) >>>l2=(0,*l1,4) 文件“”,第1行 l2=(0,*l1,4) ^SyntaxError:无效语法 如你所见。我无法使用
*
运算符将l1扩展到l2


注意:这是python2.7,Python3.5中引入了就地解包,它适用于较新版本,而不是较旧版本

# Python 3.5
In [39]: (3, *l1, 4)
Out[39]: (3, 1, 2, 3, 4)
在旧版本中,您可以使用
+
运算符或
itertools.chain
函数来处理较长的iterables:

In [40]: (3,) + l1 + (4,)
Out[40]: (3, 1, 2, 3, 4)

In [41]: from itertools import chain

In [45]: tuple(chain((3,), l1, (4,)))
Out[45]: (3, 1, 2, 3, 4)

首先,这些不是
列表
,而是
元组
。它们是相似的,但不是相同的东西

其次,
*arg
语法称为参数扩展,它只适用于函数参数

编辑:


显然,Python3.5中添加了就地解包,但是对于您遇到的绝大多数python安装,我的答案仍然是正确的。也许到2020年,当Python 2停止被支持时,这种情况将会改变,但就目前和不久的将来而言,希望上述情况属实。

这是不可能的。只需执行
l2=(0,)+l1+(4,)
这只适用于相对较新版本的Python 3。您使用的是哪个版本?这个扩展元组解包是Python3中一个相对较晚的补充,“我在这里看到了很多关于在元组之前使用*将其扩展为其他内容的问题”——这些问题是关于函数调用的。直到最近,语法才扩展到元组结构。而且,这里从来没有使用过列表,所以要小心术语。您正在使用元组。这就是为什么指定您的Python版本很重要的原因。不过,感谢您,用户显然正在使用Python 2。Python3的使用仍然相对较少,更不用说3.5了。虽然OP确实使用了3.5版之前的版本(可能是2版,但可能是更早的3版),而且对于那些版本,您的答案已经足够了,但是您的答案对Python更高版本的读者来说仍然是误导性的。至少,您应该提到这一点。您对Python2和Python3(例如,在数据科学中,Python3正在快速增长:)毫无必要地挑剔,但您的回答现在很好,所以+1。在
chain
的参数中加逗号。它是chain或+,而不是both@MadPhysicist是的,修好了!您可能只需要
链。((3,),l1,(4,)
@Kasramvd。我继续往前走,走得更远。希望你不介意。
def func(a, b):
    return a + b

my_list = [1, 2]
func(*my_list)