イミュータブル
このレッスンでできるようになることは、変更できる型と変更できない型の違いを説明し、家計簿のデータで使い分けることです。
Python の値は、後から中身を書き換えられるものと書き換えられないものに分かれます。書き換えられるものをミュータブル(可変)、書き換えられないものをイミュータブル(不可変)と呼びます。リストと辞書はミュータブル、数値と文字列とタプルはイミュータブルです。
違いがはっきり出るのは、値を関数に渡したときです。ミュータブルな値を渡して関数の中で書き換えると、呼び出した側の変数も変わります。同じ箱を共有しているからです。
def add_1000(values):
values[0] += 1000
budget = [3000, 5000]
add_1000(budget)
print(budget) # [4000, 5000]一方タプルは書き換えができないので、同じことをしようとすると TypeError で止まります。タプルを変えたいときは、書き換えるのではなく新しいタプルを作って返します。
def add_1000(values):
return (values[0] + 1000,) + values[1:]values[1:] はタプルの2番目以降を切り出したタプルです。前に1要素のタプルをつなげると、元は無傷のまま新しい組ができます。
どちらが良いという話ではありません。ためておいて後から足していく支出の一覧はリストが向いていますし、1件の支出のように記録したら中身が変わらないものはタプルが向いています。うっかり書き換えられて困るデータをタプルにしておくと、事故そのものが起きなくなります。この使い分けが中級の設計の第一歩です。
要件
- add_to_list はリストを直接書き換えること。戻り値は返さない
- add_to_tuple は元のタプルを変えず、新しいタプルを返すこと
- 表示は
リスト、元のタプル、新しいタプルの3行にすること
入出力例
出力: "リスト [4000, 5000]
元のタプル (3000, 5000)
新しいタプル (4000, 5000)"ヒント
編集 LuaGate編集部