pythonのタプルとイミュータブルについて
タプルはイミュータブルとは
「イミュータブル」というのはあくまでも「オブジェクト id を変えずに要素を追加・変更・削除をすることができないこと」のみを表します
イミュータブルでも可能なこと
- タプルを参照している変数に再代入すること
- タプルの中の要素がミュータブルな場合にその要素そのものを変更すること
a. タプルを参照している変数に再代入すること
# タプルは += の結果新しいタプルが生成される t2 = t1 = ('みかん', 'りんご') print(id(t1)) t1 += ('バナナ', 'パイナップル') print(id(t1)) print(t1 is t2) # => False print(t1) print(t2)
4511412168
4506233176
False
('みかん', 'りんご', 'バナナ', 'パイナップル')
('みかん', 'りんご')
# 一方、リストは += で元のリストが維持される l2 = l1 = ['みかん', 'りんご'] print(id(l1)) l1 += ['バナナ', 'パイナップル'] print(id(l1)) print(l1 is l2) # => True print(l1) print(l2)
4506173256
4506173256
True
['みかん', 'りんご', 'バナナ', 'パイナップル']
['みかん', 'りんご', 'バナナ', 'パイナップル']
b. タプルの中の要素がミュータブルな場合にその要素そのものを変更すること
「タプルが持つ参照」を変更することと「タプルが参照するオブジェクトの中身」を変更することは別であって、タプルが禁止しているのは前者のみです。
参照されたオブジェクトが dict 等のミュータブルなオブジェクトであれば当然そのオブジェクトの中身は更新することができます。
# 第 1 要素に dict を持つタプルを定義する # (要素数が 1 のタプルを定義するときは () 内の末尾に , を入れる必要あり) t1 = ({'mark': 'ハート', 'number': '7'}, ) print(id(t1)) # dict を変更する t1[0]['mark'] = 'スペード' print(id(t1)) print(t1) # => ({'mark': 'スペード', 'number': '7'}, )
4511897808
4511897808
({'mark': 'スペード', 'number': '7'},)
参照文献
https://www.lifewithpython.com/2017/12/python-tuple-list-difference.html