hsmwhsmw

初心者入門オブジェクトが同一かどうかの比較する(== 演算子と is 演算子の違い) | Python入門

eyecatch

数値や文字列、リストやタプルなどのオブジェクトが同じかどうかを調べるには is 演算子を使用します。ここでは is 演算子を使ってオブジェクトが同じかどうか調べる方法と、オブジェクトの値が同じかどうかを調べる == 演算子との違いを解説します。

目次

  1. is 演算子の使い方と == 演算子との違い
  2. mutableオブジェクトとimmutableオブジェクトでの is 演算子の結果の違い
  3. id関数を使ってオブジェクト固有のidを取得する

is 演算子の使い方と == 演算子との違い

Python では数値や文字列、リストやタプルはすべてオブジェクトです。オブジェクトが同じかどうかを調べるには is 演算子を使用します。

x is y       x と y が同じオブジェクトの場合は True
x not is y   x と y が別のオブジェクトの場合は True

同じような演算子に == 演算子がありますが、 == 演算子はオブジェクトの値が同じかどうかを判定する場合に使用します。異なるオブジェクトであっても値が同じであれば True となります。それに対して is 演算子は値が同じであってもオブジェクトが異なる場合は False となります。

例えば次の例をみてください。 2 つのリストを作成し、 == 演算子と is 演算子を使って調べてみます。

>>> list1 = [1, 2, 3]
>>> list2 = [1, 2, 3]
>>> list1 == list2
True
>>> list1 is list2
False
>>>

最初に == 演算子で 2 つのリストを判定してみると True となります。リストの場合は各要素が同じデータ型で同じ値を持っている場合は True となるためです。それに対して is 演算子では False となります。値は同じでもオブジェクトはそれぞれ別々だからです。

では次の例をみてください。最初のリストを作成したあとで、 2 つ目のリストには最初のリストを代入しています。

>>> list1 = [1, 2, 3]
>>> list2 = list1
>>> list1 == list2
True
>>> list1 is list2
True
>>>

この場合 list2 と list1 は同じリストのオブジェクトを指し示しています。その為、値を比較する == が True を返すだけでなく、オブジェクトが同じかどうかを判定する is 演算子も True を返します。

このように == 演算子ではオブジェクトの値が同じかどうかを判定するのに対して is 演算子ではオブジェクトが同じかどうかを判定します。

mutableオブジェクトとimmutableオブジェクトでの is 演算子の結果の違い

先ほどはリストのオブジェクトを使って試してみましたが、今度は文字列で同じように試してみます。

>>> str1 = "Apple"
>>> str2 = "Apple"
>>> str1 == str2
True
>>> str1 is str2
True
>>>

文字列のオブジェクトをそれぞれ作成しているにも関わらず == 演算子だけではなく is 演算子も True を返しています。

オブジェクトには一度作成したあとで変更することができるもの( mutable といいます)と、一度作成すると変更できないもの( immutable )があります。数値や文字列、タプルは変更できないオブジェクトです。リストや辞書は変更できるオブジェクトです。

なぜリストは同じ値を持つオブジェクトを 2 つ作った時にそれぞれオブジェクトが異なるのに文字列では同じ値を持つオブジェクトを 2 つ作った時に同じオブジェクトになったのかというと、変更できるオブジェクトの場合は値が同じでも必ずオブジェクト毎に異なるオブジェクトとなりますが、変更できないオブジェクトの場合は同じデータ型で同じ値のオブジェクトが既に存在した場合は新しいオブジェクトを作成せずに既にあるオブジェクトを参照する場合があるためです。

注意が必要なのは immutable のオブジェクトは必ず別々のオブジェクトが作成されるのに対して、 mutable のオブジェクトは同じ値のオブジェクトを作成した時に同じオブジェクトを参照する場合もあるししない場合もあるということです。必ず同じオブジェクトになるという前提でコードを記述するのはお勧めできません。

id関数を使ってオブジェクト固有のidを取得する

組み込み関数で用意されている id 関数を使うと引数に指定したオブジェクトを表す固有の番号を取得することができます。例えば同じ値を持つリストを 2 つ作成し、それぞれ id 関数を使ってオブジェクトの id を取得してみます。

>>> list1 = [1, 2, 3]
>>> list2 = [1, 2, 3]
>>> id(list1)
2621838287560
>>> id(list2)
2621838778312
>>>

このようにリストの場合は同じ値を持つオブジェクトを作成しても、それぞれ別々のオブジェクトが割り当てられていることが分かります。

今度はリストを作成したあとで、別のリストに代入してみます。

>>> list1 = [1, 2, 3]
>>> list2 = list1
>>> id(list1)
2621839912264
>>> id(list2)
2621839912264
>>>

今度は 2 つのリストが同じ id となりました。 2 つのリストは同じオブジェクトを参照していることが確認できます。

次に同じ値を持つ 2 つの数値を作成して確認してみます。

>>> num1 = 10
>>> num2 = 10
>>> id(num1)
140732009243568
>>> id(num2)
140732009243568
>>>

別々に作成したオブジェクトですが、オブジェクトの id が同じであり同じオブジェクトを参照していることが確認できます。このように数値や文字列などの immutable オブジェクトの場合は既に同じ値を持つオブジェクトが存在した場合は同じオブジェクトを参照する場合があることが id 関数を使っても確認することができました。

-- --

is 演算子を使ってオブジェクトが同じかどうか調べる方法と、オブジェクトの値が同じかどうかを調べる == 演算子との違いを解説しました。