35

これらの組み込みの Python データ型: listsequence、およびsliceの違いは何ですか? 私が見ているように、3 つすべてが本質的に C++ と Java がarrayを呼び出すものを表しています。

4

5 に答える 5

71

あなたの質問には非常に異なるものが混在しているので、別の質問に答えるだけです

あなたは今、Python で最も重要なインターフェイスの 1 つについて質問しています: iterable- 基本的には、for elem in iterable.

iterablesequencegeneratorおよびの 3 つの子孫がありmappingます。

  • シーケンスは、ランダム アクセスのイテラブルです。その前のアイテムを消費することなく、シーケンスの任意のアイテムを要求できます。このプロパティを使用するslicesと、一度に複数の要素を提供する を構築できます。seq[from:until]スライスは subsequence:と n 番目ごとの item: を与えることができますseq[from:until:nth]listtupleおよびstrすべてがシーケンスです。

  • アクセスが整数位置ではなくキーを介して行われる場合、マッピングがあります。dict基本的なマッピングです。

  • 最も基本的な iterable はgeneratorです。ランダム アクセスをサポートしていないため、スライスもサポートしていません。与えられた順序ですべてのアイテムを消費する必要があります。ジェネレーターは通常、アイテムを反復処理するときにのみアイテムを作成します。作成する一般的な方法generatorsは、ジェネレータ式です。これらは、丸括弧を除いて、リスト内包表記とまったく同じように見えます(f(x) for x in y)。キーワードを使用する関数を呼び出すとyield、ジェネレーターも返されます。

すべての iterable に共通のアダプターはiteratorです。iteratorsサポートする最も基本的な型である a と同じインターフェースを持っていますgenerator。それらはiteriterable を呼び出すことによって明示的に作成され、あらゆる種類のループ構造で暗黙的に使用されます。

于 2010-05-27T13:23:09.727 に答える
15
  • list単なる配列以上のものです。アイテム数を指定せずに初期化できます。append/ /pushそれらへ、remove/ pop/delそれらからの項目、さまざまなタイプのオブジェクト (例: ) のリストを持つことができ[1,'e', [3]]、再帰的なリストを持つことができます...そしてリストをスライスすることができます。アイテムのいくつか。
  • slice明らかにするように、a[start:stop:step]フォームで拡張されたスライスを処理するために「舞台裏で」使用されるオブジェクトタイプです。help(slice)

list「シーケンス」はオブジェクトではなく、実装のような非公式のインターフェイスのようなものです。

于 2010-05-27T11:37:39.237 に答える
7
  • リストは配列に似たシーケンス型です

  • シーケンスタイプは機能的スーパーセットを記述します。

シーケンス タイプには、文字列、Unicode 文字列、リスト、タプル、バッ​​ファ、および xrange オブジェクトの 6 つがあります。

  • スライスは、部分配列 (または部分文字列も) の表記法です。

続きを読む... http://docs.python.org/glossary.html

于 2010-05-27T11:28:09.067 に答える
7

リストはシーケンスですが、シーケンスは必ずしもリストではありません。シーケンスは、シーケンス インターフェイス (「プロトコル」) をサポートする任意の型です。これは、厳密な継承階層ではなく、ダックタイピングによって行われます。シーケンスはコンテナーですが、コンテナーは必ずしもシーケンスではないことに注意してください。(シーケンスは、まあ、シーケンシャルです!)

http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-buffer-xrangeを参照してください

スライス オブジェクトは通常、シンタックス シュガー ( ) によって暗黙的に作成され、オーバーライド可能foo[2:5]なコンテナー タイプの特別なメソッド ( など) に提供されます。__getitem__独自のシーケンス/コンテナーを作成しない限り、通常はスライスを扱う必要はありません。

http://docs.python.org/reference/datamodel.html#specialnamesを参照してください

リストは配列に匹敵します。確かではありませんが、動的に拡張する配列として cPython に実装されていると思います。ただし、インターフェイスは、単純な古い配列というよりは、C++ STL ベクトルのようになります。

于 2010-05-27T11:52:40.890 に答える
2

厳密に言えば、スライスはインデックスの範囲 (開始、停止、ステップなど) を表すタイプです。スライスはコンテナー タイプではありません。スライスを使用してリストにインデックスを付けると、元のリストのサブリストのコピーである新しいリストが生成されます。

リストは異種であるという点で C++ 配列とは異なります。要素は同じ型である必要はありません。MYYN がすでに指摘しているように、「シーケンス」は Python の型ではなく、さまざまな組み込み型の記述です。

于 2010-05-27T11:36:09.047 に答える