1. ホーム
  2. python

[解決済み] Pythonのappend()とリストの+演算子、なぜ結果が違うのか?

2022-06-16 02:14:26

質問

なぜ、この2つの操作( append() を応答します。 + ) は異なる結果を与えるのでしょうか?

>>> c = [1, 2, 3]
>>> c
[1, 2, 3]
>>> c += c
>>> c
[1, 2, 3, 1, 2, 3]
>>> c = [1, 2, 3]
>>> c.append(c)
>>> c
[1, 2, 3, [...]]
>>> 

最後のケースでは、実際には無限回の再帰があります。 c[-1]c は同じです。とはなぜ違うのでしょうか? + の操作ではなぜ違うのでしょうか?

どのように解決するのですか?

なぜかを説明する。

その + 操作 が追加されます。 配列 要素を元の配列に追加します。このとき array.append の操作は、元の配列の末尾に配列(あるいは任意のオブジェクト)を挿入し、その結果 selfへの参照 を参照することになります(それゆえ、無限再帰となります)。

ここでの違いは、+操作は配列を追加するときに特定の動作をすることです(他のものと同様にオーバーロードされています。 この章 を参照)、要素を連結して追加するときに特有の動作をします。しかし、append-methodは文字通り、その要素を取る代わりに、あなたが与えた右側のオブジェクト(配列または他のオブジェクト)を追加します。

代替案

使用方法 extend() を使えば、+演算子に似た働きをする関数を使うことができます(他の人もここで紹介しているとおりです)。リストに対して + 演算子で append を真似るという逆のことをするのは賢明ではありません(私の 以前のリンク を参照してください)。

小さな歴史

お楽しみのために、ちょっとした歴史を紹介します。 の誕生、Pythonのarrayモジュール の誕生です。驚くかもしれませんが、配列はシーケンスとリストが登場したずっと後に追加されました。