In [20]: print None or False
-------> print(None or False)
False
In [21]: print False or None
-------> print(False or None)
None
この動作は私を混乱させます。なぜこれがこのように起こっているのか、誰かに説明してもらえますか?私はそれらが同じように振る舞うことを期待していました。
表現 x or y
は、x
がtrueの場合はx
に評価され、y
がfalseの場合はx
に評価されます。
上記の文の「true」と「false」は、固定値True
とFalse
ではなく、「真実」について述べていることに注意してください。 「true」であると、if
ステートメントが成功します。 「偽」であるものは失敗します。 「false」の値には、False
、None
、0
および[]
(空のリスト)。
「or」演算子は、その値がPythonicブール値の意味でtrueの場合(別名「真偽」)、その第1オペランドのvalueを返します。それは、その第2オペランドたまたまのvalueを返します。 現在のオンラインドキュメント のExpressionsに関するセクションの ブール演算 というタイトルのサブセクションを参照してください。
どちらの例でも、最初のオペランドは偽と見なされるため、2番目のオペランドの値は式の評価の結果になります。
None
、False
、およびTrue
はすべてシングルトンであることを理解する必要があります。
たとえば、_if foo is not None
_は、foo
がNone
以外の値を持つことを意味します。これは、基本的に_if foo
_である_if foo == True
_を持つのと同じように機能します。
したがって、_not None
_とTrue
は同じように機能します。また、None
とFalse
も同じように機能します。
_>>> foo = not None
>>> bool(foo)
True
>>> foo = 5 # Giving an arbitrary value here
>>> bool(foo)
True
>>> foo = None
>>> bool(foo)
False
>>> foo = 5 # Giving an arbitrary value here
>>> bool(foo)
True
_
コーディングの際に認識し、注意すべき重要なことは、2つのことを比較する場合、None
にはis
が必要ですが、True
とFalse
には_==
_。 _if foo == None
_を避けて_if foo is None
_のみを行い、_if foo != None
_を避けて_if foo is not None
_のみを行います。 _if foo is not None
_の場合、単に_if foo
_を実行します。 _if foo is None
_の場合、単に_if not foo
_を実行します。
注:True
は基本的に_1
_であり、False
は基本的に_0
_です。昔のPythonでは、値がtrueの場合は_1
_しかなく、値がfalseの場合は_0
_しかありませんでした。 _1
_の代わりにTrue
と言う方がわかりやすく、人間に優しいです。また、_0
_の代わりにFalse
と言う方がわかりやすく、人間に優しいです。
密接に関連するトピック:Pythonのor
およびand
短絡 。論理or
操作では、いずれかの引数がtrueの場合、全体がtrueになり、他に評価する必要はありません。 Pythonは即座にその「true」値を返します。終了し、何もtrueでなかった場合、処理した最後の引数を返します。これは「false」値になります。
and
は反対です。偽の値が見つかった場合、その「偽」の値で即座に終了するか、すべてを通過すると、最終の「真」の値を返します。
>>> 1 or 2 # first value TRUE, second value doesn't matter
1
>>> 1 and 2 # first value TRUE, second value might matter
2
>>> 0 or 0.0 # first value FALSE, second value might matter
0.0
>>> 0 and 0.0 # first value FALSE, second value doesn't matter
0
ブールの観点からは、両者は同じように動作し、どちらもfalseと評価される値を返します。
or
は与えられた値を「再利用」し、それが真である場合は左の値を返し、そうでない場合は右の値を返します。
Condition1 or Condition2
条件1がFalseの場合、評価してCondition2を返します。 Falseと評価されるものはありません。