29

*反復子/リスト/タプルを含む式で単項 ( ) 演算子を使用できない理由を知っている人はいますか?

関数のアンパックのみに限定されるのはなぜですか? それとも私はそれを考えるのが間違っていますか?

例えば:

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

3 に答える 3

44

PEP 4483.5で説明されているように、リスト、辞書、セット、およびタプル リテラルのアンパックが Python に追加されました。

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]

この変更の背後にある理論的根拠について、いくつかの説明を次に示します。これは、すべてのコンテキストで*[1, 2, 3]同等になるわけではないことに注意してください。1, 2, 3Python の構文は、そのように動作することを意図していません。

于 2016-01-13T12:53:07.793 に答える