4
8

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 5 years have passed since last update.

Python is と == の違い

Posted at

はじめに

投稿した記事のコメントで is と == の違い について教えていただきましたので、それについてまとめたいと思います。
(ミュータブル/イミュータブルとかの値のややこしい話とかは抜きにしてまとめてみました。)

1.== で比較しているもの

今まで vba や C を書く機会が多く、比較するときには==を使う習慣が身についてしまっていたわけですが、、、
pythonにおいて**==で比較しているのは変数の値そのもの**だそうです。

ですので、次のような場合はTrueとなります。

code.py
a=[1,2]
b=[1,2]
print(a==b)
Result
True

#2.is で比較しているもの
Pythonに限らずオブジェクト指向のプログラミング言語には、オブジェクト、クラス、インスタンスといった概念があります。ざっくりいうと、オブジェクトは枠、クラスは設計書、インスタンスはモノといったイメージになると思います。
(オブジェクト=焼き菓子、クラス=クッキーの作り方、インスタンス=クッキー(完成品)的な関係)

インスタンスとかややこしいことを言っていますが、 a = 10 とか何気なく変数に値を代入するだけでもインスタンスが作られています。

Pythonでは、isは、インスタンス同士のidが同じか否かを判断します。
idはid(変数)で調べることが出来ます。

code.py
a="cookies" #"cookies"のidをaに格納
b="cookies" #"cookies"のidをbに格納
A=["cookies"] #動的にメモリを確保し、確保したメモリに"cookies"を格納 → idは動的に確保した場所を示す
B=["cookies"] #動的にメモリを確保し、確保したメモリに"cookies"を格納 → idは動的に確保した場所を示す

print(id(a),id(b))
print(a is b) #idの比較
print(a==b) #値の比較
print(id(A),id(B))
print(A is B)
print(A==B)
Result
2737112766312 2737112766312 #ここの二つの値が同じ
True
True
2737112556296 2737111787336 #ここの二つの値が異なる
False
True

#まとめ
is と == の二つの目線で変数を比較出来ることを学びました。
is は変数の id を比較し、 == は 変数の値そのもの を比較するようです。

C言語とかのポインタとかアドレスとかの話を、オブジェクト指向プログラミングで話すと今回の内容のような話になりそうですね。すごくややこしい反面、こうゆうところを気にしてコーディングできると綺麗なコードがかけるんだろうな~とか思いました!

4
8
4

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
4
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?