web-dev-qa-db-ja.com

Pythonの 'True'および 'False'

このコードを実行してみました:

path = '/bla/bla/bla'

if path is True:
    print "True"
else:
    print "False"

そして、Falseと表示されます。 Pythonは値を持つものをTrueとして扱うと思った。なぜこうなった?

53
PSS

http://docs.python.org/reference/expressions.html#boolean-operations から:

ブール演算のコンテキストで、また式が制御フローステートメントで使用される場合、次の値はfalseとして解釈されます:False、None、すべてのタイプの数値ゼロ、および空の文字列とコンテナー(文字列、タプル、リスト、辞書を含む) 、sets、frozensets)。他のすべての値はtrueとして解釈されます。

ここであなたが誤解していると思う重要な言い回しは、「偽として解釈される」または「真として解釈される」です。これは、これらの値のいずれかがTrueまたはFalseと同一であること、またはTrueまたはFalseと等しいことさえ意味しません。

'/bla/bla/bla'は(ifステートメントのように)ブール式が予想される場合はtrueとして扱われますが、式'/bla/bla/bla' is Trueおよび'/bla/bla/bla' == Trueはfalseに評価されますイグナシオの答えの理由。

66
Andrew Clark

isはIDを比較します。文字列が非文字列と同一になることはありません。

==は平等です。ただし、文字列がTrueまたはFalseに等しくなることはありません。

あなたはどちらも欲しくない。

path = '/bla/bla/bla'

if path:
    print "True"
else:
    print "False"
101

他のポスターはis Trueが何をするのかを説明しましたが、私はあなたの投稿のこの部分に応答したかったです:

Pythonは値を持つものはすべてTrueとして扱うと思いました。なぜこうなった?

Javaから来て、私もこれにつまずいた。 Pythonは、値を持つものをTrueとして扱いません。証人:

if 0:
    print("Won't get here")

0はFalseとして扱われるため、何も出力されません。実際、数値型のゼロはFalseと評価されます。また、decimalが期待どおりに機能するようにしました。

from decimal import *
from fractions import *

if 0 or 0.0 or 0j or Decimal(0) or Fraction(0, 1):
    print("Won't get here")

Falseと評価される他の値は次のとおりです。

if None or False or '' or () or [] or {} or set() or range(0):
    print("Won't get here")

ソース:

  1. https://medium.com/@dawran6/python-truth-value-testing-is-awesome-dae6c23cc1c2
  2. https://docs.python.org/3.7/library/stdtypes.html#truth-value-testing
3
Trenton