・short イミュータブルな型となる条件はかなり例外的であり、自分でクラスを作成する場合は意識的に条件を満たそうとしなければイミュータブルな型にはならないはずです。 意外に難しい「コンテナ」「シーケンス型」「イテラブル」「整数型」「ミュータブル」「イミュータブル」などの分類を整理し、覚え方を紹介します。Pythonのチュートリアルやドキュメントを読むとき、これらの用語が理解できないと読み進められません。この機会に頭の中を整理しましょう。, なお、ネット上でも情報が入り乱れていて何が正しいのかわからない状態ですので、できるだけ引用先や理由も説明したいと思います。, 「Python♪モヤモヤを解消する明快な用語集」の用語集Top(索引)はこちらです。, モヤモヤを解消する明快な用語集を目指します。例えば言葉の定義が「グレー」なものは「グレー」であると解説します。なお、同じ言葉でも、例えば「Python」と「Java」では定義が違うことがあります。 その場合、「python」での定義を解説します。, この記事では代表的な組み込みデータ型である「int, float, complex, list, bytearray, dict, set, tuple, str, range, bytes, frozenset, file object」について分類したいと思います。, まず、 以下の「データ型の分類と覚え方」 の中で、(1) 数値型、(2) ミュータブル、(3) イミュータブルを覚えましょう。int, list, tupleなどデータ型の概要が理解できていれば難しくないと思います。, なお、rangeとfile objectは感覚がつかみにくいかもしれません。rangeはシーケンスであり、かつ、イテラブルです。file objectはシーケンスではないですが、イテラブルです。, (1) 数値型:int, float, complex   ※boolはintのサブクラスだが数値型ではない。(2) ミュータブル:list, bytearray, dict, set ※変更可能なオブジェクト(3) イミュータブル:数値型, bool, tuple, str, range, bytes, frozenset, file object ※変更ができないオブジェクト(4) ミュータブルなシーケンス:list, bytearray ※順序を持たないdict, setはシーケンスではない。(5) イミュータブルなシーケンス:tuple, str, range, bytes ※数値型、boolはデータが1つしかないのでシーケンスではない。 ※順序を持たないfrozensetはシーケンスではない。 ※len()などが使えるrangeはシーケンス。 ※len()などが使えないfile objectはシーケンスではない。 ※file objectのように順番に取り出せるだけではシーケンスではない。(6) シーケンス型:list, bytearray, tuple, str, range, bytes  ※(4)と(5)を合わせたもの(7) イテラブル:シーケンス, dict, set, frozenset, flie object   ※データが1つしかない数値型, boolはイテラブルではない。 ※組み込みデータ型では数値型, bool 以外はすべてイテラブル。 ※file objectも1つずつデータを取り出せるのでイテラブル。(8) マッピング型:dict(9) コンテナ:シーケンス, dict, set, frozenset  ※コンテナとは複数のオブジェクトを格納できるデータ型。 ※データが1つしかない数値型, boolはコンテナではない。 ※それぞれの要素を個別に扱うことができないfile objectはコンテナではない。 ※シーケンス(rangeも含む)は基本的に全てコンテナ ※コンテナとは基本的に__contains__メソッドを実装しているオブジェクトのこと。, 数値型は、int型(整数型), float型(浮動小数点数型), complex型(複素数型)です。まさに数値なのでわかりやすいと思います。, ところで、bool型(ブール型、真偽値型)は数値型に含まれるのでしょうか。以下、Pythonのドキュメントの記述です。bool型は整数(int)のサブタイプであると記述されているものの、数値型はint, folat, complexの3種類であると限定されており、bool型は数値型に含まれていません。, 4.4. JavaScriptはイミュータブルを強く押し出した言語ではないので、途中で多少ミュータブルな状態が混ざりますが、そこは我慢してください。 基本的に、 コピーしてから操作する 、ということを徹底していればイミュータブルなオブジェクトっぽく処理することができます。 immutability - immutable - イミュータブル 定数 違い .

数値型 int, float, complex数値型には3種類あります: 整数 、浮動小数点数 、複素数です。さらに、ブール型は整数のサブタイプです。整数には精度の制限がありません。, 参考までに「みんなのPython 柴田 淳(著)」でも数値型にbool型は含まれていませんでした。, 「ミュータブル(mutable)」は変更が可能なオブジェクトであり「変更可能体」ともいいます。また、「イミュータブル(immutable)」は変更ができないオブジェクトであり「変更不能体」ともいいます。それぞれのデータ型は、以下のようにミュータブルかイミュータブルのどちらかに分類されます。, (a) ミュータブル( 変更可能なオブジェクト ): list, bytearray, dict, set(b) イミュータブル(変更ができないオブジェクト): 数値型(int, float, complex), bool, tuple, str, range, bytes, frozenset, file object, コード04は変更不能体であるtupleを代入した変数の変更です。3行目のように要素を部分的に変更することはできませんが、4行目のように内容をそっくり入れ替えることはできます。, ここで重要なのは、4行目で変数aを(99, 2)に入れ替えた時に、もとの(1, 2)がコンピューターのメモリー上でどうなってしまうかです。, 変数aに(99, 2)を上書きし、(1, 2)が消えてしまうのではなく、(1, 2)は現在の記憶場所に放置され、別の記憶場所に(99, 2)が定義し直されます。, 「そんな細かいこと覚える必要はないのでは?」と思われるかもしれませんが、「関数へのデータの受け渡し」「浅いコピー」「深いコピー」などの理解に役立ちますので知っておくべきです。分からない場合には、導入として以下の記事を参考にしてください。, 複数の要素を順番に並べたデータ型がシーケンス型です。なお、数値型やboolは複数の要素を持ちませんからシーケンス型ではありません。また、dict, set, frozensetは複数の要素を持つことができますが、順番という概念がないのでシーケンス型ではありません。, (a) シーケンス型 : list, bytearray, tuple, str, range, bytes, (b) ミュータブルなシーケンス: list, bytearray※s.append(x), s.clear(), s.copy(), s.extend(t), s.insert(i,x), s.pop([i]), s.remove(x), s.reverse()などは、 ほとんどの「ミュータブルなシーケンス」で使用可能なメソッド です。, (c) イミュータブルなシーケンス: tuple, str, range, bytes, なお、rangeはシーケンス型ですが、file objectはシーケンス型ではありません。理由は以下のとおりです。, 前から順番に呼び出せるだけではシーケンスではありません。file objectは、他のシーケンスのように要素指定やlen(), max(), index()を使った演算ができません。他のシーケンスとは使える関数が大きく異なるためシーケンスの分類には含まれません。, (反復可能オブジェクト) 要素を一度に 1 つずつ返せるオブジェクトです。 反復可能オブジェクトの例には、(list, str, tuple といった) 全てのシーケンス型や、 dict や ファイルオブジェクト といった幾つかの非シーケンス型、 あるいは Sequence 意味論を実装した__iter()__メソッドか__getitem()__メソッドを持つ任意のクラスのインスタンスが含まれます。, rangeは他のシーケンス(listやtupleなど)と同じようにlen(), max(), index()を使った演算が可能です。5行目のように要素を指定することもできます。さすがに「+」「*」の演算はできませんでしたが、rangeは他のシーケンスと共通点が多くシーケンスです。, 基本的なシーケンス型は 3 つあります: リスト、タプル、range オブジェクトです。バイナリデータ や テキスト文字列 を処理するように仕立てられたシーケンス型は、セクションを割いて解説します。, イテレータは、求められるたびに要素をひとつずつ返し、データがなくなるとデータの代わりに StopIteration 例外を返すオブジェクトです。例外を返すことにより、データがなくなったことを示し、その後はデータを返すことができなくなります。イテレータは便利な機能であり、様々な関数で利用されています。, なお、iter() 関数を用いれば、range, listなどからイテレータを生成することができます。, また、for文はイテレータとは無関係のように見えますが、実はforループを使うたびに、range, listなどから、新たな未使用のイテレータを生成して利用しています。, 「イテレーション」意味:「反復処理」のことです。用例:「for文のループを抜け出してしまうのではなく、continueにより次のイテレーションを直ちに開始する。」, 「イテレートする」意味:(イテレータから)データを一つずつ取り出すこと。用例:「zip()により、複数のリストから同時にイテレートすることができる。」, イテレータに変換可能なオブジェクトのことを 「イテラブル(iterable)」または「反復可能体」といいます。 以下のようなデータ型がイテラブルです。, シーケンス(list, bytearray, tuple, str, range, bytes), dict, set, frozenset, flie object, データが1つしかない数値型, boolはイテラブルではありません。しかし、それ以外の多くのデータ型がイテラブルであり、主要な組み込みデータ型では数値型, bool以外は全てイテラブルです。シーケンスがイテラブルであることは容易に想像できますが、シーケンスではないflie objectや順番が定義されていないdict, set, frozensetもイテラブルです。, イテレータは、求められるたびに要素をひとつずつ返し、データがなくなるとデータの代わりに例外を返すオブジェクトですが、非常に便利な機能であるためにイテレーターの機能を利用する関数が多くあります。for文のinの後にイテラブルを使用したり、iter(), max(), min(), sorted(),sum(), list(), set()といった関数の引数にイテラブルを使用します。, もし、イテラブルという言葉がなければ、例えばiter()の引数に使用できるデータ型を説明するためにデータ型を列挙しなければなりません。, データ型がイテラブルであるかどうかはfor文のinの後で使用したり、iter()の引数として使用することで確認することができます。, イテラブルはfor文でinの後に用いることができます。file objectもコード03のようにfor文で使うことができ、イテラブルであることが分かります。, キーとなる値(key)を任意のオブジェクト(value)に対応付けるデータ型です。キーをインデックスとしてオブジェクトを検索するため、キーは他のキーと比較し区別できる必要があり、ミュータブルな値をキーにすることはできません。標準のマッピング型は辞書 (dict) だけです。, コンテナとは「複数のオブジェクトを格納できるオブジェクト」です。数値型やboolは複数のオブジェクトを格納できないのでコンテナではありません。, Pythonのドキュメントでは、コンテナについて「他のオブジェクトに対する参照をもつオブジェクト」と紹介してされています。 他のオブジェクトに対する参照を集めてひとまとめにしています。, 他のオブジェクトに対する参照をもつオブジェクトもあります; これらは コンテナ (container) と呼ばれます。コンテナオブジェクトの例として、タプル、リスト、および辞書が挙げられます。オブジェクトへの参照自体がコンテナの値の一部です。, シーケンス型、辞書型、集合型がコンテナであり、以下のデータ型がコンテナに分類されます。, シーケンス(list, bytearray, tuple, str, range, bytes), dict, set, frozenset, list, tuple, dict, set, frozensetは、要素が明確に分かれており、複数のオブジェクトが格納されていることが明快です。, str, bytearry, bytesは複数のオブジェクトには見えませんが、例えばx = 'abc'では'a', 'b', 'c'という複数のオブジェクトが集まったものでありコンテナです。, rangeは、実際には複数のオブジェクトが集まったものではないかもしれませんが、複数のオブジェクトが集まったように振る舞うことができるのでコンテナです。, file objectはイテラブルであり、順にデータを出力することはできますが、演算子inによって要素の内容を確認することもできません。それぞれの要素を個別に扱うという機能が低く、複数のオブジェクトをグルーピングすることにより機能性を高めるというコンテナの考え方からは外れており、コンテナではありません。, なお、コンテナであるかどうかの判別は__contains__を実装しているかどうかが有力な判断材料になります。, イテラブルはfor文のinのあとに使えるかどうかで判断することが可能ですが、コンテナは定義が曖昧であり、コンテナであることを明確に判断する方法はありません。そこで、コンテナの分類を上記のように判断した理由を説明したいと思います。, Pythonのドキュメントにおいて以下の記述があり、str, tuple, list, dict, set, frozensetがコンテナであることは明記されています。, ブール演算のコンテキストや、式が制御フローの文で使われる際には、次の値は偽だと解釈されます: False 、 None 、すべての型における数値の 0、空の文字列、空のコンテナ (文字列、タプル、リスト、辞書、集合、凍結集合など)。 それ以外の値は真だと解釈されます。 ユーザ定義のオブジェクトは、__bool__() メソッドを与えることで、真偽値をカスタマイズできます。。, しかし、bytes, bytearray, range, file object については、それぞれ、コンテナなのかどうか明記されていません。そこで、これらは__contains__の実装を確認することによって判断します。, 書籍「科学技術計算のためのPython入門」では、コンテナ型、シーケンス型を以下のように定義しされており、シーケンス型はコンテナ型の一部であると記述されています。つまり、bytes, bytearray, rangeもコンテナに分類されています。, 複数のデータを保持できる文字列型やリスト、タプル、バイト、バイト配列、集合型、辞書型は、総称してコンテナ型と呼ばれます。さらに、コンテナ型のうち順番付きのデータ集合であって、インデックス(データの順番を表す数値)を使ってそのデータにアクセスできるデータ型をシーケンス型また、そのデータ型変数を単にシーケンスと呼びます。, 「 Python ドキュメント >> Python 標準ライブラリ » 8.