web-dev-qa-db-ja.com

(1 in [1,0] == True)がFalseと評価されるのはなぜですか?

この質問 の答えを見ていたとき、自分の答えが理解できませんでした。

これがどのように解析されているのか、私にはよくわかりません。 2番目の例がFalseを返すのはなぜですか?

_>>> 1 in [1,0]             # This is expected
True
>>> 1 in [1,0] == True     # This is strange
False
>>> (1 in [1,0]) == True   # This is what I wanted it to be
True
>>> 1 in ([1,0] == True)   # But it's not just a precedence issue!
                           # It did not raise an exception on the second example.

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    1 in ([1,0] == True)
TypeError: argument of type 'bool' is not iterable
_

助けてくれてありがとう。私は本当に明白な何かを見逃しているに違いないと思います。


これはリンクされた複製とは微妙に異なると思います:

式0 <0 == 0がPythonでFalseを返すのはなぜですか?

どちらの質問も、人間の表現の理解に関係しています。式を評価する方法は2つあるようです(私の考えでは)。もちろんどちらも正しくありませんでしたが、私の例では、最後の解釈は不可能です。

_0 < 0 == 0_を見ると、各半分が評価され、式として理にかなっていることが想像できます。

_>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True
_

したがって、リンクはこれがFalseを評価する理由に答えます:

_>>> 0 < 0 == 0
False
_

しかし、私の例では1 in ([1,0] == True)は式として意味をなさないため、考えられる解釈が2つある(明らかに間違っている)のではなく、1つしか考えられません。

_>>> (1 in [1,0]) == True
_
150
Peter Wood

Pythonは実際にここで比較演算子チェーンを適用します。式は次のように翻訳されます

(1 in [1, 0]) and ([1, 0] == True)

明らかにFalseです。

これは、次のような式でも発生します

a < b < c

これは

(a < b) and (b < c)

bを2回評価せずに)。

詳細は Python言語のドキュメント を参照してください。

190
Sven Marnach