2016-01-13 10 views
21

単体(*)演算子がイテレータ/リスト/タプルを含む式で使用できない理由について誰にも分かっていますか?Python:PythonのSplat/unpack演算子*は式で使用できません。

なぜ機能のアンパックに限定されますか?私はそれを考えて間違っていますか?例えば

は:

>>> [1,2,3, *[4,5,6]] 
File "<stdin>", line 1 
[1,2,3, *[4,5,6]] 
     ^
SyntaxError: invalid syntax 

なぜ*オペレータない:

[1, 2, 3, *[4, 5, 6]] give [1, 2, 3, 4, 5, 6] 

*演算子は関数で使用されたときに呼び出すのに対し、それが展開ん

f(*[4, 5, 6]) is equivalent to f(4, 5, 6) 

類似点は+ですリストを使用する場合は*ですが、別のタイプのリストを拡張する場合は使用できません。例えば

# This works 
gen = (x for x in range(10)) 

def hello(*args): 
    print args  
hello(*gen) 

# but this does not work 
[] + gen 
TypeError: can only concatenate list (not "generator") to list 
+0

あなたはその使用法から何を期待していますか?つまり、なぜあなたはそれをしたいのですか? – Lafexlos

+0

OK質問を更新する – Har

+0

2つの別々の質問のように見えます。最初の構文はもっと関連しています.2番目は 'list .__ add__'の動作です。 –

答えて

33

を指摘し、PEP 448で説明したように、今、この機能を持っているのPython 3.5に固定しています

Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) on Windows (64 bits). 

>>> [1, 2, 3, *[4, 5, 6]] 
[1, 2, 3, 4, 5, 6] 

Here

この変更の理論的根拠のためのいくつかの説明です。

+0

は完全な情報を使用しますが、 'python-2.7'(議論のタグを参照)について議論します –

+0

Python 2.7を作成するときにコンテナ内の*の使用を考慮していませんでしたか? – Har

+3

@AndriyIvaneykoこれは質問されたように質問に答えます。 OPは推論を知りたいのであって、Py2.7ではそれをどうやって行うのではない。 – timgeb

4

アステリックス*は単に単項演算子ではありません、それはfunctions definitionsfunctions callsため引数開梱作業です。 python3.5から始まる、*が機能していないだけで使用することができますのみ関数のparamsで動作するようにしてリストとない、タプルなど

NOTEを使用することになっ

ので* params、@B. Mの答えはPythonのその変更を大きく記述しています。

リストを連結する必要がある場合は、代わりにlist1 + list2を使用して目的の結果が得られます。これはサポートされていない

gen = (x for x in range(10)) 
[] + list(gen) 
+1

これは関数呼び出しと関数定義で機能します。それはあなたが後者の場合にのみ機能することを暗示しているように思えるので、あなたは言葉遣いを編集するかもしれません。 – SuperBiasedMan

+1

@SuperBiasedManありがとう、訂正のために私は答えを更新しました。 –

2

:リストとジェネレータを連結する 単にgeneratorlistのタイプのオブジェクト、別のリストを事前連接を渡します。 (パイソン2は私の知る限り、割り当ての左側に*をサポートしていないが)のPython 3は、より良いメッセージを与える:

Python 3.4.3+ (default, Oct 14 2015, 16:03:50) 
>>> [1,2,3, *[4,5,6]] 
    File "<stdin>", line 1 
SyntaxError: can use starred expression only as assignment target 
>>> 

f(*[4,5,6])が展開f(4,5,6)

関数の引数と同等です特別なケース。Pythonの2.xに開梱せない

+2

python 3を指摘していただきありがとうございます。私はそれを試してみましたが、python 3.5.1で動作します>>> [* [1,2,3,4]] => [1,2,3,4]私はそれを知らなかった。それはジェネレータでも動作します:)非常にクール[1,2,3、(xはxの範囲(10))] – Har

関連する問題