isでは同一オブジェクトかどうかを判定し、同じであれば真、is notでは同一オブジェクトでなければ真と判断されます。
このオブジェクトを判断するものはis,is not演算子以外にも==,!=もオブジェクトを判断します。
==はオブジェクトの値を比較し等しければ真となります。
isも==もオブジェクトを比較し、等しければ真となります。
isと==の違い
まず、pythonでオブジェクトというものはデータを持つもののことで、
a = 100
b = 100
ここでオブジェクトというのは100です。
そのため、aとbは同じオブジェクトになるということです。
プログラムで説明すると、
a = 100
b = 100
if a == b:
print("値は同じです")
else:
print("値は違います")
これは「値は同じです」になります。
a = 100
b = 100
if a is b:
print("値は同じです")
else:
print("値は違います")
これも「値は同じです」になります。
オブジェクトが同じ場合は真になりますが、オブジェクトが違う場合はどうなるか見ていきます。
a = [100]
b = [100]
if a == b:
print("オブジェクトの値は同じです")
else:
print("オブジェクトの値は異なっています")
これは「オブジェクトの値は同じです」になります。
しかし、これをisで行うと
a = [100]
b = [100]
if a is b:
print("オブジェクトは同じです")
else:
print("オブジェクトは異なっています")
「オブジェクトは異なっています」このように偽になります。
100では同じだったのに[100]では同じになっていません。
これは参照するオブジェクトのデータがミュータブルかイミュータブルかで変わってきます。
ミュータブルというのは変更可能なデータで、イミュータブルは変更不可能なものを指します。
たとえば、
a = [1, 2, 3]
a[1] = 5
print(a)
これを実行すると[1, 5, 3]が出力されます。
a = 100
a = 200
print(a)
これを実行すると、200が出力されます。
a = [1, 2, 3]では最初に割り当てられたオブジェクトに対して変更(ミュータブル)を行い出力していますが、a=100,a=200では100に対して変更を行っているわけではなく新しくオブジェクトを作って割り当てています(イミュータブル)。
イミュータブルにはint,float,str,tuple,bool,frozenset,bytesなどがあります。
ミュータブルにはlist,dict,set,bytearray,class,dequeなどがあります。
is notと!=の違い
is notと!=の違いはisと==の違いと同じようにオブジェクトが変更できるものか変更できないものかで区別することができます。
a = 100
b = 100
if a != b:
print("値は違います")
else:
print("値は同じです")
a = 100
b = 100
if a is not b:
print("値は違います")
else:
print("値は同じです")
これはどちらも「値は同じです」が出力されます。
ミュータブルなものでは
a = [100]
b = [100]
if a != b:
print("オブジェクトの値は異なっています")
else:
print("オブジェクトの値は同じです")
これは「オブジェクトの値は同じです」になります。
a = [100]
b = [100]
if a is not b:
print("オブジェクトは異なっています")
else:
print("オブジェクトは同じです")
これは「オブジェクトは異なっています」になります。
このようにミュータブルかイミュータブルかで処理の方法が異なってきます。
そのため、listなど変更可能なデータを編集をするときには気を付けなければなりません。
コメント