1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pythonにおける==、isの違い

Last updated at Posted at 2020-07-06

pythonにある同じものかどうかを判断する方法は二つありますね。==とisです。戻り値はいずれもBooleanですが、それでは何が違うのか?というとことは気になるところです。

結論

簡単にいうと、isは両者のメモリローケーションを比較しているのに対し、==は単純に両者は同じ値であるかを見ています。それだけです。

例えば?

じゃコードを見てみて(ターミナルにてpython3を立ち上げる)

>>> a = [1, 2, 3]
>>> b = a
>>> b is a 
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True

解説します。aにリストを代入、bにも同じくaを代入すると、同じメモリローケーションから引用していることがわかります。従い、これはisを使うとTrueです。
次に文字列操作の[:]を使ってリストを複製します。そうすると、コピーが出来上がるので、メモリ上は別物になります。従って、これはFalse。ということです。

実際にidを見てみると

>>> id(a)
4364243328
>>> 
>>> id(b)
4364202696

そうですよね。Falseになっていることから、idが異なるのは当然の話。

しかし、以下のコードのような例外があります。

>>> a = 256
>>> b = 256
>>> a is b
True
>>> a == b
True
>>>
>>> a = 1000
>>> b = 10**3
>>> a == b
True
>>> a is b
False

これは何を意味しているのかね?aとbは別々に数字を代入しているのに、上と下は結果が違うぞ。 
さて解説するよ。 
pythonはパフォーマンス改良のため、256などの小さい整数について違う処理をしています。そういった特別な整数は同じidで同じ場所へと格納しているそうです。そうすると、このように256ではisを使っても==を使っても同じTrueとなり、1000のような大きい数字についてはそうはなりません。

ということでした。いかがでしょうか。
ご指摘ありましたら、どうぞ突っ込んでください。

さてまたね

1
3
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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?