Pythonにおけるデータ型の分類と可変性の詳細

Pythonは動的型付け言語であり、その柔軟性と強力な標準ライブラリは、多様なデータ型の仕組みによって支えられています。本記事では、Pythonの基本的なデータ型の定義から、その分類、そしてプログラミングにおいて重要となる「可変性(ミュータビリティ)」の概念について解説します。

Pythonの基本データ型

Pythonには主に6つの組み込みデータ型が存在します。これらはデータの性質や保存方法に基づいて分類されます。

  • 数値 (Number): 整数、浮動小数点数、複素数などを含む数値データ。
  • 文字列 (String): 文字のシーケンス。テキストデータを扱う。
  • リスト (List): 順序を持ち、変更可能な要素の集合。
  • タプル (Tuple): 順序を持ち、変更不可能な要素の集合。
  • セット (Set): 重複を許さない、順序を持たない要素の集合。
  • 辞書 (Dictionary): キーと値のペアでデータを管理するマッピング型。

データ型の定義例

以下に各データ型の宣言と初期化の例を示します。

# 数値型の例
int_val = 42
float_val = 3.14159
is_active = True  # bool型は数値型のサブクラス(True=1, False=0)
complex_num = 5 + 6j

# 文字列型の例
greeting = 'Hello World'
message = "Python Programming"

# リスト型の例(変更可能、順序あり)
numbers = [10, 20, 30]
mixed_data = ["text", 100, False]
nested = [[1, 2], [3, 4]]

# タプル型の例(変更不可、順序あり)
single_item = (99,)  # 要素が1つの場合はカンマが必要
coordinates = (10, 20, 30)

# セット型の例(重複なし、順序なし)
unique_ids = {1, 2, 3, 4}
char_set = set("abcde")

# 辞書型の例(キーと値のペア)
config = {"host": "localhost", "port": 8080}

データ型の分類と特性

データ型はその構造や、メモリ上での振る舞いによっていくつかの観点から分類できます。

構造による分類

データ型は、データの並び順や管理方法によって以下のようにグループ化できます。

  • 数値型・文字列型: 基本的な値を保持する型。
  • シーケンス型: 要素が順序付けられている型。リスト、タプル、文字列などが含まれます。
  • コレクション型(セット・辞書): 内部的にハッシュテーブルなどを使用し、順序が保証されない(または辞書は挿入順序を保持するがインデックスアクセスはできない)型。

可変性による分類

Pythonのデータ型において最も重要な概念の一つが、オブジェクトが作成された後にその状態を変更できるかどうかです。

可変オブジェクト (Mutable Objects)

オブジェクト生成後、その内部のデータ(要素の追加、削除、値の変更など)を変更できます。これらはメモリ上の同じIDを保持したまま内容が書き換わります。

該当型: list, set, dict

不変オブジェクト (Immutable Objects)

オブジェクト生成後、その内容を変更することはできません。値を更新しようとすると、新しいオブジェクトが新たなメモリ領域に作成され、変数はその新しいオブジェクトを指し示すようになります。

該当型: int, float, bool, str, tuple

不変オブジェクトはデータが変更されないため、代入時の挙動やコピーの仕組みがシンプルになります。一方で、可変オブジェクトを扱う際は、意図しない副作用(参照渡しによる元のデータの変更など)に注意が必要です。

特殊ケース:タプルとリストの関係

タプル自体は不変オブジェクトですが、その要素として可変オブジェクト(例えばリスト)を含んでいる場合、タプル自体の構造(要素の入れ替えなど)は変更できなくても、内部のリストの内容は変更可能です。

# タプルの中にリストを含むケース
data_packet = ("Header", [100, 200])

# 以下はエラーになる(タプルの要素の変更は不可)
# data_packet[0] = "New Header"

# しかし、タプル内のリスト(可変オブジェクト)の要素は変更可能
data_packet[1].append(300)

print(data_packet) 
# 出力: ('Header', [100, 200, 300])

7月24日 21:44 投稿