SIGMA-SE Tech Blog

SIGMA-SE Tech Blog

Python - 組込みデータ型の特性 : immutable, mutable, iterable, sequence, mapping

目的

この記事では、Pythonを扱う上で頻繁に登場する組込みデータ型の特性を表す用語について記載する。

イミュータブル(immutable): 同一アドレスで変更不可

同一オブジェクト(アドレスが同一)での値の変更ができないオブジェクト。
そのため、値を変更すると別オブジェクト(別のアドレス)として再生成される。

  • イミュータブルな型: Python公式ページのドキュメント

  • int型(イミュータブル)を例に変更前の値と変更後の値のアドレスを比較

    $ python
        # int_a を int型 の 1で定義
        >>> int_a = 1
        >>> type(int_a)
        <class 'int'>
        # int_a のアドレスを確認
        >>> id(int_a)
        139837241521312
        # int_a を 2 に変更
        >>> int_a = 2
        # int_a のアドレスを確認 ⇒ 変更前と別アドレスとなる。
        >>> id(int_a)
        139837241521344
    
  • bool型(イミュータブル)を例に変更前の値と変更後の値のアドレスを比較

    $ python
        # bool_a を bool型の False で定義
        >>> bool_a = False
        >>> type(bool_a)
        <class 'bool'>
        # bool_a のアドレスを確認
        >>> id(bool_a)
        139837241113440
        # bool_a を True に変更
        >>> bool_a = True
        # bool_a のアドレスを確認 ⇒ 変更前と別アドレスとなる。
        >>> id(bool_a)
        139837241113408
    

ミュータブル(mutable): 同一アドレスで変更可

同一オブジェクト(アドレスが同一)で値を変更できるオブジェクト。
(値を変更してもアドレスが変わらない。)

また、オブジェクトの一部を変更できるデータ型は、オブジェクトの中身を頻繁に編集することを前提としているため、アドレスが変わらない(わざわざ変える必要がない)ミュータブルとなっている。

  • ミュータブルな型: Python公式ページのドキュメント

  • list型(ミュータブル)を例に変更前の値と変更後の値のアドレスを比較

    $ python
        # list_a を list型で定義
        >>> list_a = [1, 2, 3, 4, 5]
        >>> type(list_a)
        <class 'list'>
        # list_a のアドレスを確認
        >>> id(list_a)
        139837220876360
        # list_a に 7 を追加
        >>> list_a.append(7)
        >>> print(list_a)
        [1, 2, 3, 4, 5, 7]
        # list_a のアドレスを確認 ⇒ 変更前と同一アドレスとなっている。
        >>> id(list_a)
        139837220876360
    

イテラブル(iterable): 反復抽出可

要素を一つずつ抽出し、反復処理ができるオブジェクト。
(特殊な加工なしで for文のループ対象として使用できるオブジェクト)

また、ミュータブルオブジェクトはすべてイテラブルなオブジェクトとなる。

  • イテラブルな型: Python公式ページのドキュメント

  • イテラブルの反復処理使用例

    $ python
        # list_a を list型で定義
        >>> list_a = [1, 2, 3]
        >>> type(list_a)
        <class 'list'>
        # 要素を出力する 反復処理
        >>> for element in list_a:
        ...     print(element)
        ...
        1
        2
        3
        # str_a を str型で定義
        >>> str_a = "abc"
        # 要素を出力する 反復処理
        >>> for element in str_a:
        ...     print(element)
        ...
        a
        b
        c
    

シーケンス(sequence): インデックス指定可

インデックスを指定して直接要素にアクセスできるオブジェクト。

また、ミュータブルと同様にシーケンスオブジェクトはすべてイテラブルなオブジェクトとなる。

  • シーケンスな型: Python公式ページのドキュメント

  • シーケンスオブジェクトからインデックスを指定した抽出例

    $ python
        # list_a を list型で定義
        >>> list_a = [1, 2, 3]
        >>> print(list_a[0])    # インデックス 0 を指定
        1
        >>> print(list_a[1])    # インデックス 1 を指定
        2
        >>> print(list_a[2])    # インデックス 2 を指定
        3
        # str_a を str型で定義
        >>> str_a = "abcdefg"
        >>> print(str_a[1])    # インデックス 1 を指定
        'b'
        >>> print(str_a[3])    # インデックス 3 を指定
        'd'
        >>> print(str_a[5])    # インデックス 5 を指定
        'f'
    

マッピング(mapping): 連想配列

任意に決めたキーで要素を抽出することができるオブジェクト。

シーケンスオブジェクトがインデックスを指定して抽出するのに対し、マッピングオブジェクトは、オブジェクト生成時に自作したキーを指定して抽出する。
※ 一般的に連想配列と言われる配列のこと。

  • マッピング型は、dict型のみ: Python公式ページのドキュメント

  • dict型(マッピング)からキーを指定した抽出例

    $ python
        >>> dict_a = {"s1":123, "s2":456, "s3":789}
        >>> type(dict_a)
        <class 'dict'>
        >>> print(dict_a["s1"])
        123
        >>> print(dict_a["s2"])
        456
        >>> print(dict_a["s3"])
        789
    


Copyright SIGMA-SE All Rights Reserved.
s-hama@sigma-se.jp