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)