web-dev-qa-db-ja.com

FalseまたはNone vs. NoneまたはFalse

In [20]: print None or False
-------> print(None or False)
False

In [21]: print False or None
-------> print(False or None)
None

この動作は私を混乱させます。なぜこれがこのように起こっているのか、誰かに説明してもらえますか?私はそれらが同じように振る舞うことを期待していました。

57
Virgiliu

表現 x or yは、xがtrueの場合はxに評価され、yがfalseの場合はxに評価されます。

上記の文の「true」と「false」は、固定値TrueFalseではなく、「真実」について述べていることに注意してください。 「true」であると、ifステートメントが成功します。 「偽」であるものは失敗します。 「false」の値には、FalseNone0および[](空のリスト)。

78
RichieHindle

「or」演算子は、その値がPythonicブール値の意味でtrueの場合(別名「真偽」)、その第1オペランドのvalueを返します。それは、その第2オペランドたまたまvalueを返します。 現在のオンラインドキュメントExpressionsに関するセクションの ブール演算 というタイトルのサブセクションを参照してください。

どちらの例でも、最初のオペランドは偽と見なされるため、2番目のオペランドの値は式の評価の結果になります。

10
martineau

NoneFalse、およびTrueはすべてシングルトンであることを理解する必要があります。

たとえば、_if foo is not None_は、fooNone以外の値を持つことを意味します。これは、基本的に_if foo_である_if foo == True_を持つのと同じように機能します。

したがって、_not None_とTrueは同じように機能します。また、NoneFalseも同じように機能します。

_>>> 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が必要ですが、TrueFalseには_==_。 _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と言う方がわかりやすく、人間に優しいです。

5
Boštjan Mejak

密接に関連するトピック: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
4
Nick T

ブールの観点からは、両者は同じように動作し、どちらもfalseと評価される値を返します。

orは与えられた値を「再利用」し、それが真である場合は左の値を返し、そうでない場合は右の値を返します。

1
sth
Condition1 or Condition2

条件1がFalseの場合、評価してCondition2を返します。 Falseと評価されるものはありません。

0
Andrey Gubarev