質問するログイン新規登録
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3204閲覧

なぜ「x == None」としてはいけないか?

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

2クリップ

投稿2018/01/31 09:18

1

2

Pythonコードの書き方のガイドであるPEP8 -- Style Guide for Python Code日本語訳を読んでいます。

これの「プログラミングに関する推奨事項」の2項目目に、次のようにあります。

None のようなシングルトンと比較をする場合は、常に isis notを使うべきです。絶対に等値演算子を使わないでください。

これは、if x == Noneif x is Noneにしろと言っているのだと思いますが、これはなぜですか?

あと、シングルトンというのはNone以外には何があるのでしょうか?

yohhoy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Noneとの比較にisを使うべき理由
==で比較する際にも、まず同一性を判定する実装が一般的だからです。
isを使わず==を使うと、そこを遠回りする分無駄です。

Noneとの比較に==を使うべきでない理由
==はオーバーロード可能だからです。(厳密にはちょっと違うけど)
NoneはNoneだけと等値であるべきで、それが崩れるのは避けるべきです。

Python

1class Hoge: 2 def __eq__(self, other): 3 return True 4 5h = Hoge() 6print(h == None) # True 7print(None == h) # True 8print(h is None) # False

あと、シングルトンというのはNone以外には何があるのでしょうか?

未確認ですが、素直な実装ならTrueやFalseもシングルトンかと思います。
True/Falseはどちらもbool型でしたね。
軽く調べてみたところ、組み込み定数ではNotImplementedがシングルトンのようです。

投稿2018/01/31 09:26

編集2018/01/31 09:47
LouiS0616

総合スコア35678

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/01/31 09:31

2番目は分かりましたが、1番目がよくわかりません。==で比較する前に同一性が判定されてる例(と理由)が欲しいです。
LouiS0616

2018/01/31 09:43

一般的と書いておいて難なのですが、すぐには根拠となる文言を見つけられませんでした。 Pythonの実装をハックしたことはないので、どこかでそのような説明を目にしたと思うのですが... とりあえず、__eq__が定義されていないインスタンス同士の比較の場合、比較がオブジェクトの同一性の判定に移されるのは確かです。
LouiS0616

2018/01/31 09:49 編集

また『何をもって等価と判断するか』にも依って、__eq__メソッドの負担が変わります。 百個比較すべき属性を持つオブジェクト同士の場合、それらの全てを比較する必要があるかもしれません。 そのようなとき、単なる数値であるidの比較に挿げ替えられるかもしれない点で、前もってisで同一性判定をするのは有用です。
退会済みユーザー

退会済みユーザー

2018/01/31 09:49

理解しました。ありがとうございます。
guest

0

BA後ですがサクッと調べてみると以下のリンクが

== None使うよりis None使う方が早いという点から。もうひとつはLouiS0616さんが説明されてますね。

What about speed? Interestingly, there's a "big" difference: timeit.timeit("1 is None", number=10000000) is about 73% faster than timeit.timeit("1 == None", number=10000000) on my machine (0.67 seconds vs 1.17 seconds). Relatively large, but absolutely tiny.

投稿2018/01/31 10:18

wakame

総合スコア1170

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問