これらの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
は同じです。 +
操作と異なるのはなぜですか?
_+
_ operation は、元の配列に array 要素を追加します。 _array.append
_ 操作は、元の配列の最後に配列(または任意のオブジェクト)を挿入します。その結果、そのスポットではreference to selfになります(したがって無限再帰)。
ここでの違いは、要素を連結することにより、配列を追加するとき(他のようにオーバーロードされる、シーケンスの この章 を参照)、+操作が特定の動作をすることです。ただし、append-methodは、文字通り、ユーザーが要求することを行います。要素を取得する代わりに、オブジェクトの右側(配列またはその他のオブジェクト)に追加します。
+演算子と同様に機能する関数を使用する場合は、 extend()
を使用します(他のユーザーもここに示しています)。反対のことをするのは賢明ではありません:リストに対して+演算子を使用して追加を模倣しようとすること(理由については、私の 以前のリンク を参照してください)。
おもしろいことに、ちょっとした歴史:1993年2月の Pythonでのarrayモジュールの誕生 それは驚くかもしれませんが、配列とリストが登場してから配列が追加されました。
連結演算子 _+
_ は、2項中置演算子であり、リストに適用されると、2つのオペランドのそれぞれのすべての要素を含む新しいリストを返します。 list.append()
メソッドは mutator
のlist
であり、単一のobject
引数(具体的な例では、件名のリストc
) list
。あなたの例では、これはc
がそれ自身への参照を追加することになります(したがって、無限再帰)。
list.extend()
メソッドは、sequence
引数をサブジェクト list
と連結するミューテーターメソッドでもあります。具体的には、sequence
の各要素を反復順に追加します。
_+
_ は演算子であるため、式の結果を新しい値として返します。非チェーンmutator
メソッドである場合、 list.extend()
はサブジェクトリストをその場で変更し、何も返しません。
これは、上記のAbelの答えがリスト、シーケンス、配列の議論を混ぜることによって引き起こされる可能性のある潜在的な混乱のために追加しました。Arrays
は、整数データ型の配列を格納するより効率的な方法として、シーケンスとリストの後にPythonに追加されました。arrays
と混同しないでください。 lists
。それらは同じではありません。
array docs :から
配列はシーケンス型であり、リストに非常によく似ていますが、配列に格納されるオブジェクトの型が制限されます。タイプは、オブジェクト作成時に、単一の文字であるタイプコードを使用して指定されます。
append
はリストに要素を追加します。新しいリストでリストを拡張する場合は、extend
を使用する必要があります。
>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
Pythonリストは異種です。つまり、同じリスト内の要素は任意のタイプのオブジェクトにできます。式:c.append(c)
は、リストにオブジェクトc
を追加します。この場合、リスト自体をリストのメンバーにします。
表現 c += c
は2つのリストを一緒に追加し、結果を変数c
に割り当てます。オーバーロード+
演算子はリストに定義され、その内容が最初のリストの要素と2番目のリストの要素である新しいリストを作成します。
したがって、これらは実際には、設計によって異なることを行うために使用される異なる表現です。
探しているメソッドは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).
ドキュメント を参照してください:
list.append(x)
- リストの最後にアイテムを追加します。 a [len(a):] = [x]と同等です。
list.extend(L)-指定されたリスト内のすべてのアイテムを追加してリストを拡張します。 a [len(a):] = Lと同等です。
c.append(c)
は自身にcを「追加」します要素として。リストは参照型であるため、これにより再帰的なデータ構造が作成されます。
_c += c
_は、cの要素をcに追加するextend(c)
と同等です。