以下の内容はhttps://let.blog.jp/tag/==より取得しました。


0 == 0.0
PHP で 0 === 0.0 が違うってのを見て 「え?そうなの!?」 と思ったので調べてみた

◯ PHP

<?php

var_dump(gettype(0));
var_dump(gettype(0.0));
var_dump(0 == 0);
var_dump(0 === 0.0);
string(7) "integer"
string(6) "double"
bool(true)
bool(false)

int と float (double) が別の型
型が違うから === だと false

◯ Python

他の言語も

> type(0)
<class 'int'>
> type(0.0)
<class 'float'>
> 0 == 0.0
True
> 0 is 0.0
False

Python でも == は同じで is になると False
is は型を見てるわけじゃなくてオブジェクトの参照比較
0 と 0.0 は別のオブジェクトになってるってこと

◯ Ruby

   0.class
=> Integer
0.0.class
=> Float
0 == 0.0
=> true
0 === 0.0
=> true
0.eql?(0.0)
=> false
0.equal?(0.0)
=> false

Ruby は === でも true だったけど eql? と equal? メソッドでも比較ができて
こっちは厳密に比較されるようで false

◯ JavaScript

> typeof 0
'number'
> typeof 0.0
'number'
> 0 == 0.0
true
> 0 === 0.0
true

JavaScript は全部 number 型で float 型とかないので 型比較も行う === を使っても true
見分けるのは不可能
これも true ⇩

new Uint8Array(1)[0] === new Float32Array(1)[0]
// true

JavaScript に慣れてるせいで PHP のに驚いたけど number がまとまってるのは少ないし false になるほうが普通なのかな
だけど値比較なら true になるべきだし int と float で同じ値でも型が違うだけで false になるほうが不便そう
== 使えばいいといえばいいんだけど 文字列とかでも変換されて比較されるから予想外なものでも一致しそう
キャストして === がたぶんベストなんだろうけど 数値比較のためだけに毎回キャストするのもなぁ
Python の == と is
よく違いがわからなくなるやつ
JavaScript の == と === と書いてるのを見かけるけど違う

== は値を比較するので [1, 2] のリストを 2 回作って == で比較すると True
is は参照を比較するので False

値の比較は言語のビルトインだけ特別なものがあるわけじゃなくて 単純に比較用のメソッドを実行した結果を返してるだけ
__eq__ メソッドを実装すれば自分でも扱える
list などはデフォルトで中身が一緒なら同じなるように __eq__ が定義されてる
一部の値は違っても xxx プロパティが一緒なら同じ扱いにするとかもできる

is はオブジェクトの参照を比較するので __eq__ 関係なく別オブジェクトなら False
メソッド実行せず参照比較だけなので速度的には速いはず

◯ 全部 True にする
class A:
def __init__(self, val):
self.value = val

def __eq__(self, target):
return True

a1 = A(100)
a2 = A(200)

print(a1.value) # 100
print(a2.value) # 200
print(a1 == a2) # True
print(a1 is a2) # False

◯ 中の値で比較する
class B:
def __init__(self, val):
self.value = val

def __eq__(self, target):
return self.value == target.value

b1 = B(100)
b2 = B(200)

print(b1.value) # 100
print(b2.value) # 200
print(b1 == b2) # False
print(b1 is b2) # False

こっちも参照



以上の内容はhttps://let.blog.jp/tag/==より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14