#
3.1 オブジェクト、値、および型

Python における オブジェクト (object) とは、データを抽象的に 表したものです。Python プログラムにおけるデータは全て、オブジェクトま たはオブジェクト間の関係として表されます。(ある意味では、プログラムコー ドもまたオブジェクトとして表されます。これはフォン・ノイマン: Von Neumann の ``プログラム記憶方式コンピュータ: stored program computer'' のモデルに適合します。)

オブジェクトはアイデンティティ値 (identity) 、型 (type) 、そして値 (value) を持ちます。オブジェクトが一度生成されると、そのオブジェクトの アイデンティティ値 は決して変化することがありません; アイデンティ ティ値をオブジェクトのメモリ上のアドレスと考えてもかまいません。 演算子 ``is`' は、二つのオブジェクト間のアイデンティティ値を比 較します; 関数 `id()` は、オブジェクトのアイデ ンティティ値を表す整数 (現在の実装ではオブジェクトのメモリ上のアドレス) を返します。 オブジェクトの 型 もまた変わることがありません。 3.1オブジェクトの型は、そのオブジェクトのサポートする操作 (``長さを持っているか？'' など) を決定し、その型のオブジェクトが 取りうる値について定義しています。 `type()` 関数は、オブジェクトの型 (型自体も一つのオブジェクトです) を返します。オブジェクトによっては、 値 (value) を変えることができます。値を変えることができる オブジェクトは 変更可能 (mutable) であるといいます; 値を 一度設定すると、その後は変えることができないオブジェクトは 変更不能 (immutable) であると呼びます。 (変更不能なコンテナオブジェクトが変更可能なオブジェクトへの参照を 含んでいる場合、その値は後者のオブジェクトの変更によって変わる 場合があります; その場合でも、コンテナの含んでいるオブジェクトの 集まりは変わらないため、コンテナは変更不能と考えます。したがって、 変更不能性 (immutability) は、厳密には変更できない値を持っている こととは違い、もっと微妙な概念です。) オブジェクトの変更可能性は型で決定されます; 例えば、数値、文字列、 およびタプルは変更不能であり、辞書やリストは変更可能です。

オブジェクトを明示的に破壊することはできません; しかし、オブジェクト に到達不能 (unreachable) になると、ガベージコレクション (garbage-collection) によって処理されます。実装では、ごみ収集を遅らせたり、全く行わない ようにすることができます -- 到達可能なオブジェクトをごみ収集処理して しまわないかぎり、どう実装するかは実装品質の問題です。 (実装上の注意: 現在の実装では参照カウント (reference-counting) 手順を 使っており、(オプションとして) 循環参照を行っているごみオブジェクトを 遅延検出します。この実装ではほとんどのオブジェクトを到達不能になると 同時に処理することができますが、循環参照を含むごみオブジェクトの収集が 確実に行われるよう保証しているわけではありません。循環参照を持つごみ オブジェクト収集の制御については、 Python ライブラリリファレンス を 参照してください。)

実装のトレース機能やデバッグ機能を使えば、通常は収集されてしまう ようなオブジェクトを生かしておくことがあるので注意してください。 また、 ``try`...`except`' 文を使って例外を捕捉できる ようにすると、オブジェクトを生かしておくことがあります。

オブジェクトによっては、開かれたファイルやウィンドウといった、 ``外部 (external) の'' リソースに対する参照を行っています。 これらのリソースは、オブジェクトがごみ収集された際に解放される ものと理解されていますが、ごみ収集が行われる保証はないので、 こうしたオブジェクトでは外部リソースを明示的に解放する 方法、大抵は `close()` メソッドを提供しています。 こうしたオブジェクトは明示的に close するよう強く奨めます。 操作をする際には、``try`...`finally`' 文を使うと 便利です。

他のオブジェクトに対する参照をもつオブジェクトもあります; これらは コンテナ (container) と呼ばれます。コンテナオブジェクトの例 として、タプル、リスト、および辞書が挙げられます。オブジェクトへの 参照自体がコンテナの値の一部です。ほとんどの場合、コンテナの値と いうと、コンテナに入っているオブジェクトの値のことを指し、それら オブジェクトのアイデンティティではありません; しかしながら、 コンテナの変更可能性について述べる場合、今まさにコンテナに入っている オブジェクトのアイデンティティのことを指します。したがって、 (タプルのように) 変更不能なオブジェクトが変更可能なオブジェクト への参照を含む場合、その値が変化するのは変更可能なオブジェクトが 変更された時、ということになります。

型はオブジェクトの動作のほとんど全てに影響します。オブジェクトの アイデンティティが重要かどうかでさえ、ある意味では型に左右されます: 変更不能な型では、新たな値を計算するような操作を行うと、実際には同じ 型と値を持った既存のオブジェクトへの参照を返すことがありますが、 変更可能なオブジェクトではそのような動作は起こりえません。例えば、 "`a = 1; b = 1`" とすると、 `a` と `b` は値 1 を持つ 同じオブジェクトを参照するときもあるし、そうでないときもあります。 これは実装に依存します。しかし、 "`c = []; d = []`" とすると、 `c` と `d` はそれぞれ 二つの異なった、互いに一意な、新たに作成された空のリストを参照する ことが保証されています。 ("`c = d = []`" とすると、 `c` と `d` の両方に同じ オブジェクトを代入します)

... もまた変わることがありません。3.1
  Python 2.2 以降、型とクラスの段階的な統合が始まっている ため、このドキュメントで主張されている内容が 100% 正確で完全と いうわけではなくなりました: 例えば、場合によっては、ある管理された 条件下でなら、オブジェクトの型を変更することができます。 このマニュアルに大幅な改訂が施されるまでは、このドキュメントでの 記述は、``旧クラス型 (classic class)'' に関してのみ 信頼できる内容と考えねばなりません。Python 2.2 および 2.3 では、 互換性のためにクラシックなクラスがまだデフォルトとなっています。