オブジェクトが同一かどうかの比較

広告

比較演算子ではオブジェクトが持つ値の比較を行いました。値が同じであればオブジェクトそのものは別のものでも構わなかったのですが、今度はオブジェクトが同じオブジェクトなのかどうかを比較してみます。

オブジェクトが同一かどうかを調べるいは「is」演算子を使います。

左辺 is 右辺

左辺と右辺のオブジェクトが同じオブジェクトだった場合には「True」を返します。

例えば次のように記述します。

str1 = "ABC"
str2 = "ABC"

print str1 == str2
print str1 is str2

変数「str1」と変数「str2」はオブジェクトが持つ値は同じでも、参照しているオブジェクトは別々のものです。結果的に「str1 == str2」はオブジェクトが持つ値を比較するだけなので「True」を返しますが、「str1 is str2」ではオブジェクトが異なるので「False」を返します。

str1 = "ABC"
str2 = str1

print str1 == str2
print str1 is str2

今度は変数「str2」には変数「str1」が代入されています。よって変数「str1」と変数「str2」は同じオブジェクトを参照することになります。この時は「str1 == str2」も「str1 is num2」も「str2」を返します。

ただし、実際にはどちらの場合でも「str1 is str2」は「True」を返します。規約上はオブジェクトは使用されるたびに作成されるはずですが、効率化のために場合によっては同じオブジェクトを使いまわすこともあるようです。よって「is」演算子の結果をあまりあてには出来ません。

なおオブジェクトが同一ではないことを調べるいは「is not」演算子を使います。

左辺 is not 右辺

左辺と右辺のオブジェクトが別のオブジェクトだった場合には「True」を返します。

サンプルコード

では実際に試してみます。

#coding: UTF-8

num1 = 10
num2 = 10

print "num1 == num2", num1 == num2
print "num1 is num2", num1 is num2

name1 = "Hello, Yamashita.How are you doing?"
name2 = "Hello, Yamashita.How are you doing?"

print "name1 == name2", name1 == name2
print "name1 is name2", name1 is name2

list1 = [1, 2, 3]
list2 = [1, 2, 3]

print "list1 == list2", list1 == list2
print "list1 is list2", list1 is list2

list1 = [1, 2, 3]
list2 = list1

print "list1 == list2", list1 == list2
print "list1 is list2", list1 is list2

上記を「test5-1.py」として保存します。保存する時の文字コードはUTF-8です。そして次のように実行して下さい。

オブジェクトが同一かどうかの比較

( Written by Tatsuo Ikura )