[ 最終更新日: 2026-06-14 21:37 閲覧回数: 8回 ]
今日の発見〜ミュータブルな値は代入先の値に影響する
いきなりの問題
以下のdata1 data2の値は?
data1 = [10, 20, 30]
data2 = data1
data1[1] = 40
答えはdata1 data2とも [10, 40, 30]です。
ミュータブルのリストの値の変更は、他のリストに影響する
>>>data1 = [10, 20, 30]
>>>data2 = data1
>>>print(data2)
[10, 20, 30] # この時点では data2 = [10, 20, 30]
>>> data1[1] = 40
>>> print (data1,data2)
[10, 40, 30] [10, 40, 30]
数学では同じことをやっても x = 20 y =10 のままだ。
x = 10
y = x
x = 20 厳密にはこの x は前の x と同値だが、異なるメモリに格納されたものと考えられる。
>>> x = 10
>>> print(id(x))
140653654485584 #同じ x でも 最初と最後の x の id は異なる
>>> y = x
>>> x = 20
>>> print(id(x),x,id(y),y)
140653654485904 20 140653654485584 10
x, y ともに int 型だからイミュータブルで変更ができないので、他の代入先には影響しない
ミュータブルなリスト data1 の場合は data1 が書き換えられることによって、同じくミュータブルな data2 が書き換えられています。
ミュータブルでないタプルの場合はどうか
>>> data1 = [10, 20, 30]
>>> data2=tuple(data1)
>>> data1[1]=40
>>> print(data1,data2)
[10, 40, 30] (10, 20, 30)
ミュータブルのリストの変更も、タプルに変換された data2 には影響していません。
まとめ
- ミュータブルの値の変更は、代入先のミュータブル値も変更する。
- 変更されたくない値は、int型、タプル型のイミュータブルに変換して格納しておくこと。