Pythonで理解すべき10のミュータブルオブジェクト事例

PythonミュータブルオブジェクトチュートリアルのサムネイルPython
この記事は約15分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればサンプルコードを活用して機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

今日は、Python初心者の皆さんに向けて、ミュータブルオブジェクトの理解を深めるための具体的な事例を紹介します。

ミュータブルオブジェクトとは、値を変更できるオブジェクトのことを指します。

明確で詳細な説明を用いて、ミュータブルオブジェクトの重要性を理解し、Pythonスキルを次のレベルへと進めましょう!

●Pythonとは

Pythonは、読みやすさが特徴のプログラミング言語で、様々なプラットフォームで利用できます。

Pythonは、非常に直感的でありながらパワフルな言語で、初心者からプロの開発者まで幅広いユーザーに支持されています。

●ミュータブルとイミュータブルの概念

Pythonでは、オブジェクトはミュータブル(変更可能)とイミュータブル(変更不可能)の2つに大別されます。

ミュータブルオブジェクトは、オブジェクトが生成された後もその状態を変更できます。

一方、イミュータブルオブジェクトは、一度生成されるとその状態を変更できません。

●ミュータブルオブジェクトの例

ここで、Pythonにおける主なミュータブルオブジェクトの例をいくつか見てみましょう。

○リスト

リストは、Pythonで最もよく使用されるデータ型の一つです。

リストは、様々なデータ型の要素を持つことができ、その要素は変更可能、つまりミュータブルです。

□サンプルコード1:リストの操作

下記のサンプルコードは、Pythonのリストを操作する基本的な例を紹介しています。

この例では、初めに数値のリストを作成し、その後、リストの一部を置き換えています。

numbers = [1, 2, 3, 4, 5] # 数値のリストを作成
print(numbers) # [1, 2, 3, 4, 5]

numbers[0:2] = ['one', 'two'] # リストの一部を置き換える
print(numbers) # ['one', 'two', 3, 4, 5]

このコードを実行すると、最初に[1, 2, 3, 4, 5]と表示され、その後、リストの最初の2つの要素が’one’と’two’に置き換えられ、[‘one’, ‘two’, 3, 4, 5]と表示されます。

これにより、リストがミュータブルであることを確認できます。

○辞書

辞書もまた、Pythonで頻繁に使用されるミュータブルなデータ型です。

辞書は、キーと値のペアを保持し、これらのペアは変更可能です。

□サンプルコード2:辞書の操作

下記のコードは、Pythonの辞書を操作する基本的な例です。

この例では、初めに文字列のキーと値を持つ辞書を作成し、その後、特定のキーの値を変更しています。

person = {'name': 'John', 'age': 30} # 文字列のキーと値を持つ辞書を作成
print(person) # {'name': 'John', 'age': 30}

person['age'] = 31 # 特定のキーの値を変更
print(person) # {'name': 'John', 'age': 31}

このコードを実行すると、最初に{‘name’: ‘John’, ‘age’: 30}と表示され、その後、’age’の値が31に変更され、{‘name’: ‘John’, ‘age’: 31}と表示されます。

これにより、辞書がミュータブルであることを確認できます。

○集合

集合は、順序を持たないユニークな要素の集まりを表すミュータブルなデータ型です。

集合は要素の追加や削除が可能です。

□サンプルコード3:集合の操作

下記のサンプルコードは、Pythonの集合を操作する基本的な例を紹介しています。

この例では、初めに数値の集合を作成し、その後、集合に新たな要素を追加しています。

numbers = {1, 2, 3, 4, 5} # 数値の集合を作成
print(numbers) # {1, 2, 3, 4, 5}

numbers.add(6) # 集合に新たな要素を追加
print(numbers) # {1, 2, 3, 4, 5, 6}

このコードを実行すると、最初に{1, 2, 3, 4, 5}と表示され、その後、新たな要素6が追加され、{1, 2, 3, 4, 5, 6}と表示されます。

これにより、集合がミュータブルであることを確認できます。

これらの例から、Pythonのミュータブルオブジェクトは、その内容を後から変更することが可能であることを理解できました。

この特性は、データの動的な操作や更新を可能にし、プログラムの柔軟性を高めます。

●ミュータブルオブジェクトの利用例

ここで、ミュータブルオブジェクトが実際のプログラムでどのように利用されるか見てみましょう。

それでは、リスト、辞書、集合を使用したプログラムのサンプルコードを示紹介していきます。

○サンプルコード4:リストを使ったプログラム

このサンプルコードでは、リストに新たな要素を追加して、その結果を表示するプログラムを紹介しています。

この例では、初めに文字列のリストを作成し、その後、リストに新たな文字列を追加しています。

fruits = ['apple', 'banana', 'cherry'] # 文字列のリストを作成
print(fruits) # ['apple', 'banana', 'cherry']

fruits.append('date') # リストに新たな文字列を追加
print(fruits) # ['apple', 'banana', 'cherry', 'date']

このコードを実行すると、最初に[‘apple’, ‘banana’, ‘cherry’]と表示され、その後、新たな要素’date’が追加され、[‘apple’, ‘banana’, ‘cherry’, ‘date’]と表示されます。

○サンプルコード5:辞書を使ったプログラム

下記のサンプルコードは、辞書に新たなキーと値のペアを追加し、その結果を表示するプログラムを紹介しています。

この例では、初めに文字列のキーと値を持つ辞書を作成し、その後、辞書に新たなキーと値のペアを追加しています。

student = {'name': 'John', 'grade': 'A'} # 文字列のキーと値を持つ辞書を作成
print(student) # {'name': 'John', 'grade': 'A'}

student['age'] = 20 # 辞書に新たなキーと値のペアを追加
print(student) # {'name': 'John', 'grade': 'A', 'age': 20}

このコードを実行すると、最初に{‘name’: ‘John’, ‘grade’: ‘A’}と表示され、その後、新たなキーと値のペア’age’: 20が追加され、{‘name’: ‘John’, ‘grade’: ‘A’, ‘age’: 20}と表示されます。

○サンプルコード6:集合を使ったプログラム

最後に、集合から特定の要素を削除し、その結果を表示するプログラムのサンプルコードを紹介します。

この例では、初めに数値の集合を作成し、その後、集合から特定の要素を削除しています。

numbers = {1, 2, 3, 4, 5} # 数値の集合を作成
print(numbers) # {1, 2, 3, 4, 5}

numbers.remove(5) # 集合から特定の要素を削除
print(numbers) # {1, 2, 3, 4}

このコードを実行すると、最初に{1, 2, 3, 4, 5}と表示され、その後、要素5が削除され、{1, 2, 3, 4}と表示されます。

これらのサンプルコードから、リスト、辞書、集合などのミュータブルオブジェクトが、Pythonプログラムの中でどのように利用されるかを理解できました。

これらのオブジェクトは、データの動的な操作や更新を可能にし、プログラムの柔軟性を高めます。

●ミュータブルオブジェクトの注意点と対処法

ミュータブルオブジェクトは非常に便利ですが、注意しなければならない点もあります。

特に、オブジェクトの変更が意図しない影響を及ぼすことがあります。

次に、リスト、辞書、集合を操作する際の注意点と対処法を示すサンプルコードを示します。

○サンプルコード7:リスト操作時の注意点と対処法

このサンプルコードでは、リストのコピーを作成し、一方を変更すると他方も影響を受ける問題とその対処法を紹介しています。

この例では、初めに数値のリストを作成し、そのリストを別の変数にコピーしています。

その後、一方のリストを変更すると、もう一方のリストも影響を受けます。

list1 = [1, 2, 3] # 数値のリストを作成
list2 = list1 # リストを別の変数にコピー
print(list1) # [1, 2, 3]
print(list2) # [1, 2, 3]

list1.append(4) # 一方のリストを変更
print(list1) # [1, 2, 3, 4]
print(list2) # [1, 2, 3, 4]

このコードを実行すると、最初に二つのリストが同じ内容[1, 2, 3]を持つことが表示されます。

その後、list1に新たな要素4を追加すると、list2も影響を受けて[1, 2, 3, 4]と表示されます。

これは、リストを別の変数にコピーすると、両者は同じオブジェクトを参照するためです。

この問題を解決するには、リストの深いコピーを作成する必要があります。

下記のコードは、copyモジュールのdeepcopy関数を使用してリストの深いコピーを作成します。

import copy

list1 = [1, 2, 3] # 数値のリストを作成
list2 = copy.deepcopy(list1) # リストの深いコピーを作成
print(list1) # [1, 2, 3]
print(list2) # [1, 2, 3]

list1.append(4) # 一方のリストを変更
print(list1) # [1, 2, 3, 4]
print(list2) # [1, 2, 3]

このコードを実行すると、最初に二つのリストが同じ内容[1, 2, 3]を持つことが表示されます。

その後、list1に新たな要素4を追加しても、list2は[1, 2, 3]のままとなり、影響を受けません。

これは、deepcopyにより、list2が新しい独立したオブジェクトとなるためです。

○サンプルコード8:辞書操作時の注意点と対処法

辞書についても同様の問題があります。

このサンプルコードでは、辞書のコピーを作成し、一方を変更すると他方も影響を受ける問題とその対処法を紹介しています。

この例では、初めにキーと値のペアを持つ辞書を作成し、その辞書を別の変数にコピーしています。

その後、一方の辞書を変更すると、もう一方の辞書も影響を受けます。

dict1 = {'name': 'John', 'age': 20} # キーと値のペアを持つ辞書を作成
dict2 = dict1 # 辞書を別の変数にコピー
print(dict1) # {'name': 'John', 'age': 20}
print(dict2) # {'name': 'John', 'age': 20}

dict1['age'] = 30 # 一方の辞書を変更
print(dict1) # {'name': 'John', 'age': 30}
print(dict2) # {'name': 'John', 'age': 30}

このコードを実行すると、最初に二つの辞書が同じ内容{‘name’: ‘John’, ‘age’: 20}を持つことが表示されます。

その後、dict1の’age’の値を30に変更すると、dict2も影響を受けて{‘name’: ‘John’, ‘age’: 30}と表示されます。

これは、辞書を別の変数にコピーすると、両者は同じオブジェクトを参照するためです。

この問題を解決するには、辞書の深いコピーを作成する必要があります。

下記のコードは、copyモジュールのdeepcopy関数を使用して辞書の深いコピーを作成します。

import copy

dict1 = {'name': 'John', 'age': 20} # キーと値のペアを持つ辞書を作成
dict2 = copy.deepcopy(dict1) # 辞書の深いコピーを作成
print(dict1) # {'name': 'John', 'age': 20}
print(dict2) # {'name': 'John', 'age': 20}

dict1['age'] = 30 # 一方の辞書を変更
print(dict1) # {'name': 'John', 'age': 30}
print(dict2) # {'name': 'John', 'age': 20}

このコードを実行すると、最初に二つの辞書が同じ内容{‘name’: ‘John’, ‘age’: 20}を持つことが表示されます。

その後、dict1の’age’の値を30に変更しても、dict2は{‘name’: ‘John’, ‘age’: 20}のままとなり、影響を受けません。

これは、deepcopyにより、dict2が新しい独立したオブジェクトとなるためです。

○サンプルコード9:集合操作時の注意点と対処法

集合についても同様の問題があります。

このサンプルコードでは、集合のコピーを作成し、一方を変更すると他方も影響を受ける問題とその対処法を紹介しています。

この例では、初めに数値の集合を作成し、その集合を別の変数にコピーしています。

その後、一方の集合を変更すると、もう一方の集合も影響を受けます。

set1 = {1, 2, 3} # 数値の集合を作成
set2 = set1 # 集合を別の変数にコピー
print(set1) # {1, 2, 3}
print(set2) # {1, 2, 3}

set1.add(4) # 一方の集合を変更
print(set1) # {1, 2, 3, 4}
print(set2) # {1, 2, 3, 4}

このコードを実行すると、最初に二つの集合が同じ内容{1, 2, 3}を持つことが表示されます。

その後、set1に新たな要素4を追加すると、set2も影響を受けて{1, 2, 3, 4}と表示されます。

これは、集合を別の変数にコピーすると、両者は同じオブジェクトを参照するためです。

この問題を解決するには、集合の深いコピーを作成する必要があります。

下記のコードは、copyモジュールのdeepcopy関数を使用して集合の深いコピーを作成します。

import copy

set1 = {1, 2, 3} # 数値の集合を作成
set2 = copy.deepcopy(set1) # 集合の深いコピーを作成
print(set1) # {1, 2, 3}
print(set2) # {1, 2, 3}

set1.add(4) # 一方の集合を変更
print(set1) # {1, 2, 3, 4}
print(set2) # {1, 2, 3}

このコードを実行すると、最初に二つの集合が同じ内容{1, 2, 3}を持つことが表示されます。

その後、set1に新たな要素4を追加しても、set2は{1, 2, 3}のままとなり、影響を受けません。

これは、deepcopyにより、set2が新しい独立したオブジェクトとなるためです。

これらのサンプルコードから、ミュータブルオブジェクトの扱い方に注意することで、予期しない挙動を防ぐ方法を理解できました。

特に、オブジェクトのコピーを作成する際は、深いコピーを作成することで、オブジェクト間の影響を防ぐことができます。

●ミュータブルオブジェクトのカスタマイズ方法

ミュータブルオブジェクトはその性質上、値を変更したり、要素を追加したり削除したりすることが可能です。

しかし、ミュータブルオブジェクトを扱う際には注意が必要で、特にオブジェクトのコピーを作成するときには深いコピーを使用することで、オブジェクト間の影響を防ぐことができます。

下記のコードは、数値の集合を作成し、その集合を別の変数にコピーしています。

このコードでは、Pythonの組み込み関数setを使って数値の集合を作成し、それを別の変数にコピーしています。

この例では、集合のコピーを作成し、その後、一方の集合を変更しています。

set1 = {1, 2, 3}
set2 = set1
print(set1)
print(set2)

set1.add(4)
print(set1)
print(set2)

このコードを実行すると、最初に二つの集合が同じ内容{1, 2, 3}を持つことが表示されます。

その後、set1に新たな要素4を追加すると、set2も影響を受けて{1, 2, 3, 4}と表示されます。

これは、集合を別の変数にコピーすると、両者は同じオブジェクトを参照するためです。

しかし、これは予期しない結果をもたらす可能性があります。

なぜなら、元の集合(set1)だけを変更したつもりでも、コピーした集合(set2)も同時に変更されてしまうからです。

これを解決するには、集合の深いコピーを作成する必要があります。

それでは、copyモジュールのdeepcopy関数を使用して集合の深いコピーを作成する方法を紹介します。

import copy

set1 = {1, 2, 3}
set2 = copy.deepcopy(set1)
print(set1)
print(set2)

set1.add(4)
print(set1)
print(set2)

このコードを実行すると、set1に新たな要素4を追加しても、set2は{1, 2, 3}のままとなり、影響を受けません。

これは、deepcopyにより、set2が新しい独立したオブジェクトとなるためです。

○サンプルコード10:リスト、辞書、集合のカスタマイズ例

リスト、辞書、集合はPythonの主要なミュータブルオブジェクトであり、それぞれが独自のカスタマイズ方法を持っています。

リストは要素の追加や削除、位置の変更などが可能です。

また、辞書はキーと値のペアを保持し、キーを使用して値を追加、変更、削除することができます。

集合はユニークな要素の集まりであり、要素の追加や削除が可能で、また数学的な集合演算も可能です。

これらのミュータブルオブジェクトのカスタマイズ例については、それぞれのオブジェクトを扱う方法を紹介する記事を参照してください。

まとめ

Pythonのミュータブルオブジェクトは、その柔軟性と強力さからプログラミングにおいて重要な役割を果たします。

しかし、ミュータブルオブジェクトの扱い方によっては予期しない結果を引き起こす可能性があるため、その特性を理解し、適切に使用することが重要です。

ミュータブルオブジェクトの重要性を理解し、Pythonスキルを次のレベルへと進めましょう!