2017-02-09 13 views
0

*を別のものに展開する前に多くの質問がありましたが、それは私には当てはまりません。Pythonのインプレースアンパックが期待どおりに動作しないようです

>>> 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 

ご覧のとおり、私は...

注意を*オペレータとL2に展開するL1取得することはできません。これは、アンパックは、Python 3.5で導入されてきた、それはそれ以降のバージョンでは、古いではない作品では、場所python2.7

+0

それはできません。ちょうど 'l2 =(0、)+ l1 +(4、)' –

+2

これは比較的最近のバージョンのPython 3でのみ動作します。 –

+1

あなたはどのバージョンを使用していますか?拡張タプル展開はPython 3に比較的遅れて追加されました –

答えて

6

ですもの。あなたが長い反復可能オブジェクトのため+オペレータまたはitertools.chain機能を使用することができます古いバージョンでは

# Python 3.5 
In [39]: (3, *l1, 4) 
Out[39]: (3, 1, 2, 3, 4) 

:すべての

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) 
+1

'chain'の引数にコンマを入れます。 –

+0

それは鎖か+のどちらかで、両方ではない –

+0

@MadPhysicistはい、修正済み! – Kasramvd

1

まず、それらは、彼らがtuplesだ、listsではありません。彼らは似ていますが、同じものではありません。

第二に、*arg構文は引数拡張と呼ばれ、それが唯一の関数の引数

def func(a, b): 
    return a + b 

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

EDITのために動作します:どうやら

、インプレース開梱は、Pythonの3.5で追加されましたあなたが遭遇する圧倒的多数のPythonインストールのために、私の答えはまだ成立しています。おそらく2020年にPython 2のサポートが中止されると、これは変わるでしょうが、今と当面の間は、上記が真実であると期待してください。

+3

Nahは、Python> = 3.5という素晴らしい世界では動作します。 –

+0

これがあなたのPythonのバージョンを指定することが重要な理由です。 –

+0

記録のために、私はdownvoteをしなかった。 –

関連する問題