2017-03-29 13 views
3

私はリスト拡張の​​戻り値でいくつかの奇妙な動作に気付きました。リスト__iadd__、+ =と戻り値

私はWhy does += behave unexpectedly on lists?

このスレッドを読んだことがあるが、それはまだ意味がありません。

これは私がやったことです:

Python 3.5.2 |Anaconda custom (64-bit)| (default, Jul 2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> l = [1, 2] 
>>> print(l.extend([1])) 
None 
>>> print(l.__iadd__([1])) 
[1, 2, 1, 1] 
>>> print(l += [1]) 
    File "<stdin>", line 1 
print(l += [1]) 
     ^
SyntaxError: invalid syntax 
>>> 

私はextendは拡張オブジェクトが、Noneを返さないことを理解しています。役に立たないが、私はそれを得る。

今度は__iadd__が異なる動作をします。これは、基本的には、リストの拡張を呼び出していることがわかります。

しかし、第3のものが私を困惑させる。私は+=__iadd__の略語だと思ったのですが、なぜSyntaxErrorがここにありますか?特に__iadd__が変更されたリストを返すので、戻り値として渡すのが理にかなっています。しかし、私は関数呼び出しで+=(またはそれについては*=、例えば整数)を使うことはできないようです。

これは仕様によるものですか?

答えて

1

l.__iadd__(val)は、関数呼び出し、つまりの式です。

l += [1]は、ステートメントの割り当てです。

引数値(ここではprintに入力したもの)は、文では許可されていません。の式はのように単純です。

+0

ありがとうございました。私はこの区別を認識していませんでした。とても興味深い。他の誰も知らなかったなら、[ここにある](http://stackoverflow.com/questions/4728073/what-is-the-difference-between-an-expression-and-a-statement-in-python)a良い説明。 – Niko

+1

@Nikoさらに詳しい技術情報に興味があるなら、Pythonには、[リファレンスマニュアル](https://docs.python.org/3/reference/index.html)に式と単純な複合文の3つの完全な章があります。後でいくつかの点をブックマークしたいかもしれません:-) –

0

__iadd__+=の実装に使用されますが、2つは同一ではありません。 l += [1]はまだステートメントですが、l.__iadd__([1])です。