5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Computer SocietyAdvent Calendar 2023

Day 8

【python】isなのに==じゃないもの、な~んだ?

Last updated at Posted at 2023-12-07

この記事はKCS Advent Calendar 2023の8日目の記事です。
←7日目 9日目→

pythonのis==の違い

pythonには"同じであること"を判断するような比較演算子が二つ存在します。一つは==、もう一つはisです。
==は各クラスに設定されている、__eq__メソッドの結果を返します。基本的には値が等価であるかどうかという意味に使われ、そのようなメソッドが設定されています。
一方で、isはオブジェクトのidを取得し、それが一致しているかを判定します。つまり、オブジェクトが同一であるかどうかを判定します。この挙動は変更ができません。
pythonのすべてのオブジェクトは"識別子"であるidを持っています。組み込み関数のid()を使うことで確認することができます。

==がTrueなのに、isがFalseである例

これはめっちゃあります。
例えば、以下のものがあげられます。

a = [1,2,3]
b = [1,2,3]
c = 100000
d = sum(1 for i in range(100000))
e = "hello"
f = "".join(["h","e","l","l","o"])
print(a == b,a is b)
print(c == d,c is d)
print(e == f,e is f)

上記のコードのprintの出力はすべてTrue Falseとなります。(CPython3.11.4で検証)
==だとしても、オブジェクトが異なる場合は当然isFalseとなります。
なお、CPythonでは上記の結果となりますが、別のpython処理系では異なる結果が返ることがあります。(例えばPyPyでは、c is dTrueになります。)

isがTrueなのに、==がFalseである例

そもそも、pythonのドキュメントにこのような記述があります。

等価比較は反射的でなければなりません。 つまり、同一のオブジェクトは等しくなければなりません:
x is y ならば x == y

同じオブジェクトであるのに==がFalseを返すというのは、結構変な話ですよね。
当然、以下のようにクラスを書いてあげれば、これが実現できます。

class hoge():
    def __eq__(self,other):
        return False
a = hoge()
print(a == a,a is a)

結果はFalse Trueとなりました。実際にこのような挙動をするクラスはあるのでしょうか?

import decimal
a = float('NaN')
b = decimal.Decimal('NaN')
print(a == a,a is a)
print(b == b,b is b)

上のコードを実行してみると、結果がFalse Trueになります。
Pythonのドキュメントを読んでみると、以下のような記述があります。

非数値である float('NaN') と decimal.Decimal('NaN') は特別です。 数と非数値との任意の順序比較は偽です。 直観に反する帰結として、非数値は自分自身と等価ではないことになります。 例えば x = float('NaN') ならば、 3 < x, x < 3, x == x は全て偽で、x != x は真です。 この振る舞いは IEEE 754 に従ったものです。

よって、x == xが偽という珍しいことが起こったのですね。

おまけ

こんなリストを用意してみます。

a = [float('NaN')]

当然、a is aTrueですよね。では、a == aはどうなるでしょうか。

print(a == a) # True

予想した結果と一致しましたか?

参考・引用文献

python言語リファレンス 6. 式 (expression) 6.10.1. 値の比較

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?