オブジェクトが同一かどうかの比較する(== 演算子と is 演算子の違い)
数値や文字列、リストやタプルなどのオブジェクトが同じかどうかを調べるには is 演算子を使用します。ここでは is 演算子を使ってオブジェクトが同じかどうか調べる方法と、オブジェクトの値が同じかどうかを調べる == 演算子との違いを解説します。
(Last modified: )
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] print(list1 == list2) >> True print(list1 is list2) >> False
最初に == 演算子で 2 つのリストを判定してみると True となります。リストの場合は各要素が同じデータ型で同じ値を持っている場合は True となるためです。それに対して is 演算子では False となります。値は同じでもオブジェクトはそれぞれ別々だからです。
では次の例をみてください。最初のリストを作成したあとで、 2 つ目のリストには最初のリストを代入しています。
list1 = [1, 2, 3] list2 = list1 print(list1 == list2) >> True print(list1 is list2) >> True
この場合 list2 と list1 は同じリストのオブジェクトを指し示しています。その為、値を比較する == が True を返すだけでなく、オブジェクトが同じかどうかを判定する is 演算子も True を返します。
このように == 演算子ではオブジェクトの値が同じかどうかを判定するのに対して is 演算子ではオブジェクトが同じかどうかを判定します。
mutableオブジェクトとimmutableオブジェクトでの is 演算子の結果の違い
先ほどはリストのオブジェクトを使って試してみましたが、今度は文字列で同じように試してみます。
str1 = "Apple" str2 = "Apple" print(str1 == str2) >> True print(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] print(id(list1)) >> 1503216736256 print(id(list2)) >> 1503216718528
このようにリストの場合は同じ値を持つオブジェクトを作成しても、それぞれ別々のオブジェクトが割り当てられていることが分かります。
今度はリストを作成したあとで、別のリストに代入してみます。
list1 = [1, 2, 3] list2 = list1 print(id(list1)) >> 1503216289728 print(id(list2)) >> 1503216289728
今度は 2 つのリストが同じ id となりました。 2 つのリストは同じオブジェクトを参照していることが確認できます。
次に同じ値を持つ 2 つの数値を作成して確認してみます。
num1 = 10 num2 = 10 print(id(num1)) >> 140706808076224 print(id(num2)) >> 140706808076224
別々に作成したオブジェクトですが、オブジェクトの id が同じであり同じオブジェクトを参照していることが確認できます。このように数値や文字列などの immutable オブジェクトの場合は既に同じ値を持つオブジェクトが存在した場合は同じオブジェクトを参照する場合があることが id 関数を使っても確認することができました。
-- --
is 演算子を使ってオブジェクトが同じかどうか調べる方法と、オブジェクトの値が同じかどうかを調べる == 演算子との違いを解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。