web-dev-qa-db-ja.com

Python append()vs.リストの+演算子、これらは異なる結果を与えるのはなぜですか?

これらの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は同じです。 +操作と異なるのはなぜですか?

96
ooboo

「理由」を説明するには:

_+_ operation は、元の配列に array 要素を追加します。 _array.append_ 操作は、元の配列の最後に配列(または任意のオブジェクト)を挿入します。その結果、そのスポットではreference to selfになります(したがって無限再帰)。

ここでの違いは、要素を連結することにより、配列を追加するとき(他のようにオーバーロードされる、シーケンスの この章 を参照)、+操作が特定の動作をすることです。ただし、append-methodは、文字通り、ユーザーが要求することを行います。要素を取得する代わりに、オブジェクトの右側(配列またはその他のオブジェクト)に追加します。

代替案

+演算子と同様に機能する関数を使用する場合は、 extend() を使用します(他のユーザーもここに示しています)。反対のことをするのは賢明ではありません:リストに対して+演算子を使用して追加を模倣しようとすること(理由については、私の 以前のリンク を参照してください)。

少しの歴史

おもしろいことに、ちょっとした歴史:1993年2月の Pythonでのarrayモジュールの誕生 それは驚くかもしれませんが、配列とリストが登場してから配列が追加されました。

127
Abel

連結演算子 _+_ は、2項中置演算子であり、リストに適用されると、2つのオペランドのそれぞれのすべての要素を含む新しいリストを返します。 list.append() メソッドは mutatorlistであり、単一のobject引数(具体的な例では、件名のリストclist 。あなたの例では、これはcがそれ自身への参照を追加することになります(したがって、無限再帰)。

「+」連結の代替

list.extend() メソッドは、sequence引数をサブジェクト list と連結するミューテーターメソッドでもあります。具体的には、sequenceの各要素を反復順に追加します。

余談

_+_ は演​​算子であるため、式の結果を新しい値として返します。非チェーンmutatorメソッドである場合、 list.extend() はサブジェクトリストをその場で変更し、何も返しません。

配列

これは、上記のAbelの答えがリスト、シーケンス、配列の議論を混ぜることによって引き起こされる可能性のある潜在的な混乱のために追加しました。Arrays は、整数データ型の配列を格納するより効率的な方法として、シーケンスとリストの後にPythonに追加されました。arraysと混同しないでください。 lists。それらは同じではありません。

array docsから

配列はシーケンス型であり、リストに非常によく似ていますが、配列に格納されるオブジェクトの型が制限されます。タイプは、オブジェクト作成時に、単一の文字であるタイプコードを使用して指定されます。

17
Dave

appendはリストに要素を追加します。新しいリストでリストを拡張する場合は、extendを使用する必要があります。

>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
15
SilentGhost

Pythonリストは異種です。つまり、同じリスト内の要素は任意のタイプのオブジェクトにできます。式:c.append(c)は、リストにオブジェクトcを追加します。この場合、リスト自体をリストのメンバーにします。

表現 c += cは2つのリストを一緒に追加し、結果を変数cに割り当てます。オーバーロード+演算子はリストに定義され、その内容が最初のリストの要素と2番目のリストの要素である新しいリストを作成します。

したがって、これらは実際には、設計によって異なることを行うために使用される異なる表現です。

8
Tendayi Mawushe

探しているメソッドはextend()です。 Python ドキュメント から:

list.append(x)
    Add an item to the end of the list; equivalent to a[len(a):] = [x].

list.extend(L)
    Extend the list by appending all the items in the given list; equivalent to a[len(a):] = L.

list.insert(i, x)
    Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x).
6
Chinmay Kanchi

extend()を使用する必要があります

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

その他の情報: 追加と拡張

2
ghostdog74

ドキュメント を参照してください:

list.append(x)

  • リストの最後にアイテムを追加します。 a [len(a):] = [x]と同等です。

list.extend(L)-指定されたリスト内のすべてのアイテムを追加してリストを拡張します。 a [len(a):] = Lと同等です。

c.append(c)は自身にcを「追加」します要素として。リストは参照型であるため、これにより再帰的なデータ構造が作成されます。

_c += c_は、cの要素をcに追加するextend(c)と同等です。

2
oefe