67

Python のドキュメントでは、「コンテナー」について頻繁に言及されています。:

check_circular が False (デフォルト: True) の場合、コンテナー タイプの循環参照チェックはスキップされ、循環参照は OverflowError (またはそれ以上) になります。

しかし、コンテナの公式な定義もリストも見つかりません。

編集

Python 2.7.3 の場合:

コンテナであるチェック済みの組み込み型:

(isinstance(object, collections.Container)返品True)

  1. __contains__メソッドが定義されているコンテナ:

    • すべての組み込みシーケンス タイプ: リスト、バイト配列、文字列、Unicode 文字列、およびタプル。
    • 辞書
    • すべての組み込みセット タイプ: セットとフリーズ セット
  2. __contains__メソッドが定義されていないコンテナ:

    • xrange オブジェクト

コンテナではないビルトイン型をチェック:

(isinstance(object, collections.Container)リターンFalse):

  • Int オブジェクト
  • フロート オブジェクト
  • 長いオブジェクト
  • ブールオブジェクト
  • モジュール オブジェクト
  • ファイル オブジェクト
  • バッファ オブジェクト
  • なしオブジェクト

チェックした他の組み込み型を教えてくださいisinstance(object, collections.Container) 。それらをリストに追加します。

4

3 に答える 3

91

コンテナーは、任意の数の他のオブジェクトを保持する任意のオブジェクトです。一般に、コンテナーは、含まれているオブジェクトにアクセスし、それらを反復処理する方法を提供します。

コンテナーの例tuplelistは、、、、、これらは組み込みのコンテナです。モジュールでは、より多くのコンテナー タイプを使用できます。setdictcollections

厳密に言えば、collections.abc.Container抽象基本クラス ( collections.ContainerPython2 では) は、マジック メソッドinを介して演算子をサポートするすべての型に適用されます。したがって、書くことが__contains__できる場合x in y通常はコンテナーですが、常にではありません。コンテナーと一般的なiterableの重要な違いは、反復処理を行うと、コンテナーは参照を保持する既存のオブジェクトを返し、ジェネレーターやオブジェクトなどは作成することです。毎回新しいオブジェクト。これは、ガベージ コレクションと深いオブジェクト トラバーサル (シリアライゼーションなど) に影響を与えます。yfiledeepcopy

例として、はオペレーターをiter(lambda: random.choice(range(6)), 0)サポートしていますが、コンテナーではありません。in

マジックメソッドのみを考慮し、オペレーターをサポートする他の方法をCollections.abc.Container考慮しない抽象基本クラスの意図は、真のコンテナーが単一の操作で内部状態を目に見えて変更することなく包含をテストできる必要があることです。は抽象メソッドとして定義されているため、 if then演算子をサポートすることが保証されています。__contains__inCollections.abc.Container__contains__isinstance(x, collections.abc.Container)xin

したがって、実際には、すべてのコンテナに__contains__マジック メソッドがあります。ただし、オブジェクトがコンテナーであるかどうかをテストする場合は、サブクラス チェックが変更された場合isinstance(x, collections.abc.Container)に、明確にするため、および前方互換性のために使用する必要があります。Container

于 2012-07-20T08:51:11.683 に答える
10

http://docs.python.org/dev/library/collections.abc.html#module-collections.abcによると、コンテナの最も一般的な定義は、単に を実装するオブジェクトです__contains__。一般に、「コンテナ」や「シーケンス」などの Python の概念は抽象的に定義されていません。彼らはその行動によって「ダックタイプ」です。つまり、コンテナーは、inオペレーターを使用できるものです。

Python の組み込みコンテナー型は、tuple、list、dict、set、frozenset、str、および unicode (または Python 3 では bytes と str) であり、技術的には型ですが、特定のコンテキスト以外では一般的に使用されない他のいくつかの構成要素 (例: buffer オブジェクトと xrange オブジェクト)。モジュールには、追加のコンテナー タイプが用意されていcollectionsます。

于 2012-07-20T08:54:31.947 に答える
0

listコンテナは、や などの他のオブジェクトを含むすべての python オブジェクトですdictContainer型は ABC で、インターフェイスのように動作します。Container は、__contains__メソッドを実装するクラスです。

ここにドキュメントがあります

于 2012-07-20T08:57:12.517 に答える