[解決済み] Pythonで「if not someobj:」が「if someobj == None:」より優れているのはなぜですか?
質問
このようなコードの例をいくつか見たことがあります。
if not someobj:
#do something
でも、なぜやらないのか不思議です。
if someobj == None:
#do something
何か違いがあるのでしょうか?どちらかに優位性があるのでしょうか?
どのように解決するのですか?
最初のテストでは、Pythonはオブジェクトを
bool
の値がない場合は、その値を使用します。大雑把に言うと
私たちは、対象物に「あなたは意味があるのですか、ないのですか」と尋ねているのです。
これは、以下のアルゴリズムで行われます。
-
オブジェクトが
__nonzero__
特別なメソッド(数値組み込みのように。int
とfloat
) の場合、このメソッドを呼び出します。このメソッドはbool
の値を直接使用するか、あるいはint
とみなされる値False
がゼロの場合。 -
そうでない場合、オブジェクトに
__len__
特殊なメソッド(コンテナ内蔵型もそうです。list
,dict
,set
,tuple
というコンテナを考えて、このメソッドを呼び出します。False
が空である場合(長さが0である場合)。 -
それ以外の場合は、オブジェクトは
True
でない限りNone
と見なされ、その場合はFalse
.
2つ目のテストでは、オブジェクトが以下のものと等しいかどうかを比較します。
None
. ここで
と尋ねているのです。
これは、次のアルゴリズムを使って行われます。
-
オブジェクトが
__eq__
メソッドが呼び出され、その戻り値がbool
の結果を決定するために使用されます。if
. -
そうでない場合、オブジェクトに
__cmp__
メソッドが呼び出されます。この関数はint
の順序を示す2つのオブジェクト(-1
もしself < other
,0
もしself == other
,+1
もしself > other
). -
そうでない場合は、オブジェクトの同一性 (つまり、同じオブジェクトへの参照であるかどうか) が比較され、これは
is
演算子)。
を使った別のテストも可能です。
is
演算子を使用します。
このオブジェクトに対して、「あなたはこの特定のオブジェクトですか?
一般的に、数値以外の値では最初のテストを使い、同じ性質のオブジェクト(2つの文字列、2つの数値、...)を比較したいときには等質性のテストを使い、センチネル値(
None
の意味は、例えばメンバ・フィールドが初期化されていない場合、あるいは
getattr
または
__getitem__
メソッド) を使用します。
要約すると、:
>>> class A(object):
... def __repr__(self):
... return 'A()'
... def __nonzero__(self):
... return False
>>> class B(object):
... def __repr__(self):
... return 'B()'
... def __len__(self):
... return 0
>>> class C(object):
... def __repr__(self):
... return 'C()'
... def __cmp__(self, other):
... return 0
>>> class D(object):
... def __repr__(self):
... return 'D()'
... def __eq__(self, other):
... return True
>>> for obj in ['', (), [], {}, 0, 0., A(), B(), C(), D(), None]:
... print '%4s: bool(obj) -> %5s, obj == None -> %5s, obj is None -> %5s' % \
... (repr(obj), bool(obj), obj == None, obj is None)
'': bool(obj) -> False, obj == None -> False, obj is None -> False
(): bool(obj) -> False, obj == None -> False, obj is None -> False
[]: bool(obj) -> False, obj == None -> False, obj is None -> False
{}: bool(obj) -> False, obj == None -> False, obj is None -> False
0: bool(obj) -> False, obj == None -> False, obj is None -> False
0.0: bool(obj) -> False, obj == None -> False, obj is None -> False
A(): bool(obj) -> False, obj == None -> False, obj is None -> False
B(): bool(obj) -> False, obj == None -> False, obj is None -> False
C(): bool(obj) -> True, obj == None -> True, obj is None -> False
D(): bool(obj) -> True, obj == None -> True, obj is None -> False
None: bool(obj) -> False, obj == None -> True, obj is None -> True
関連
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] 複数行の長い文字列を作成するためのPythonicな方法
-
[解決済み] 変数が存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] オブジェクトの属性に基づいてオブジェクトのリストを並べ替えるには?
-
[解決済み] コンマを桁区切りとして数字を印刷するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
pythonを使ったオフィス自動化コード例
-
python call matlab メソッドの詳細
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
Pythonの画像ファイル処理用ライブラリ「Pillow」(グラフィックの詳細)
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】Python 'If not' 構文 [重複]。