なぜ、これらの2つの操作が(んappend()
RESP。 +
)異なる結果を与えますか?
>>> 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
同じです。どうして+
手術と違うの?
なぜ、これらの2つの操作が(んappend()
RESP。 +
)異なる結果を与えますか?
>>> 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
操作は、配列(または任意のオブジェクト)を元の配列の最後に挿入します。これにより、その場所にある自己への参照が発生します(したがって、無限再帰)。
ここでの違いは、要素を連結することにより、配列を追加すると+操作が特定の動作をすることです(他の配列と同様にオーバーロードされます。この章を参照してください)。ただし、append-methodは文字通り、ユーザーが要求することを実行します。要素を取得する代わりに、指定した右側のオブジェクト(配列またはその他のオブジェクト)を追加します。
extend()
+演算子と同様に機能する関数を使用する場合に使用します(他の人もここで示したように)。反対のことをするのは賢明ではありません。リストの+演算子を使用して追加を模倣しようとすることです(理由については、以前のリンクを参照してください)。
おもしろい、少し歴史:1993年2月にPythonで配列モジュールが誕生したことは驚くかもしれませんが、配列は配列とリストが登場した後に追加されました。
+
対称的であると期待しています:リストとリストを連結します。
連結演算子+
は、リストに適用されると、2つのオペランドのそれぞれのすべての要素を含む新しいリストを返す2項中置演算子です。list.append()
この方法は、mutator
上list
の単一追加object
(特定の例リスト内の引数をc
対象とします)list
。あなたの例では、これはc
それ自体への参照を追加することになります(したがって、無限再帰)。
このlist.extend()
メソッドは、sequence
引数を主語と連結するミューテーターメソッドでもありlist
ます。具体的には、の各要素をsequence
反復順に追加します。
演算子で+
あるため、式の結果を新しい値として返します。非連鎖mutator
メソッドであるlist.extend()
ため、件名リストをインプレースで変更し、何も返しません。
これは、上記のAbelの回答がリスト、シーケンス、および配列の議論を混合することによって引き起こす可能性のある混乱の可能性があるため、追加しました。
Arrays
整数データ型の配列を格納するより効率的な方法として、シーケンスとリストの後にPythonに追加されました。混同しないようにしてくださいarrays
とlists
。彼らは同じではありません。
配列ドキュメントから:
配列はシーケンス型であり、配列に格納されているオブジェクトのタイプが制限されていることを除いて、リストとほとんど同じように動作します。タイプは、オブジェクト作成時にタイプコード(単一の文字)を使用して指定されます。
append
要素をリストに追加しています。リストを新しいリストで拡張する場合は、使用する必要がありますextend
。
>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]
+
、extend
私たちが何か考えるべき異なる結果を生み出すとしたら。
append
と+
異なっています。それが理由です。私はこの答えが好きです。なぜなら、それがより理にかなったことを行うからです。
__lt__
Pythonでオーバーロードできないのか(最近は可能)と人々は尋ねます。なぜ質問は最も重要な質問ですが、多くの場合、答えるのが最も難しいです。彼らは、マニュアルへのポインタではなく、本質を求めます。そしてもちろん、質問が嫌いな場合(私はほとんど嫌いです)は答えないでください;-)
c += [c]
とc.append(c[:])
あまりにも。
a+b != a*b
ですか?これらは異なる操作です。それが答えです。「なぜ」は、「適切に追加するにはどうすればよいですか?」など、他の質問ほど役に立ちません。または「無限再帰につながるこの追加の何が問題になっていますか?」「Xをどうするか」または「Xを実行したときに何が問題になったか」という質問 または、「Xの代わりに何をすべきか」は、誰かが学ぶのにも役立ちますが、焦点が絞られ、使いやすく、実用的な答えを提供します。
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).