[ 最終更新日: 2026-06-20 21:13 閲覧回数: 6回 ]
同一性と同値性
Pythonらしくいうとこんな難しい言葉になりますが、同一性は一卵性双生児、同値性は同姓同名の赤の他人と例えればわかりやすいのではないでしょうか。
同一性
変数に代入することは値が格納されているメモリアドレスの番地を参照することとされ、値そのものを入れているわけではない。同一性は同じアドレスを参照しに行っている状態です。
>>> data1 = [1,2,3]
>>> data2 = data1
この式は、変数 data1 にリスト [1,2,3] を代入し、data2 には data1 を代入しているわけですが、
>>> data1 is data2
True
>>> data1 == data2
True
>>> print(id(data1),id(data2))
140297483404480 140297483404480
is 演算子も == 演算子も true を示し、その id は全く一緒です。これは data1 も data2 も同一性があるということです。「一卵性双生児」と勝手に呼ばせてもらいます。
だからイミュータブルな型の場合は、data1 を置き換えると 同じアドレスを参照しに行くため、書き換え後の結果を示すことになります
同値性
ところが、次の式は上記の式に大変似ていますが、異なる結果が示されます。勝手に「同姓同名の全くの赤の他人」と呼ばせていただきます。
>>> data1 = [1,2,3]
>>> data2 = [1,2,3]
>>> data1 is data2
False
>>> data1 == data2
True
>>> print(id(data1),id(data2))
140297483405952 140297483407360
data1 にも data2 にも 同じ要素を持つリスト [1,2,3] を代入していますが、is 演算子は False == 演算子はtrue という結果になります、
これは、値は同じでも参照しているメモリアドレスが異なることを意味し、id 関数が異なっているのはこのことを示しています。
すなわち全く同じの中身を持つ全く無関係の変数ということになります。