var = 86
print((var<90) & (var>=80))
しかし
print(var<90 & var>=80)
print(var<90 & (var>=80))
print((var<90) & var>=80)
print(var<90 & True)
`
なぜ、これらすべてがFalse与えるかを与えますか?
var = 86
print((var<90) & (var>=80))
しかし
print(var<90 & var>=80)
print(var<90 & (var>=80))
print((var<90) & var>=80)
print(var<90 & True)
`
なぜ、これらすべてがFalse与えるかを与えますか?
の
print(var<90 & True)
がprint(var < (90 & True))
と同等であるため、それはFalseを与え、一例としてprint(var<90 & True)
を取るためです。
ただし、正しい場所にカッコを入れた場合(print((var<90) & True)
)、Trueになります。
ビット演算子&
は、比較演算子よりも高い優先順位を持ちますので、最初に90 & var
が評価され、次に連鎖比較が行われます。
>>> var = 86
>>> var<90 & var>=80 # var<90, and '90&var' is greater than or equal to 80
False
>>> var<(90 & var)>=80 # same as above
False
>>> (var<90) & (var>=80)
True
ブール演算ではなくand
演算子を使用する必要があります。
関係演算子をチェーンPythonのサポートが(つまりあなたの代わりに0 < var and var < 100
の0 < var < 100
を使用することができます)と(すなわち、加算、減算、ビット演算など)による演算子の優先順位に前に関係演算子を二項演算を処理するので、失敗のすべて投稿したケースは実際に何か他のものを意味します。
var < 90 & var >= 80
は(var < 90 & var) and (90 & var >= 80)
var < 90 & (var>=80)
に相当し、第4の場合を見ているvar < 90 & True
に相当します。(var<90) & var>=80
もまた第4の場合(これはTrue & var >= 80
に解決され、0 >= 80
に解決されます)に似ています。var < 90 & True
は、var < (90 & True)
に相当します。 &
演算子の実装は、オペランドのいずれか1つが整数でない場合(動的タイピングの最大の落とし穴の1つである)、0
を返すように設計されているため、このような類似の文はすべてvar < 0
になります。
ビット演算子を使用してブール演算を実行しようとしているのはなぜですか? –
'&'を 'と'に置き換えてみてください。あなたがしていることは本当に意味をなさない。 – 101
私は 'and'演算子を使用すると思います。彼らがなぜFalseを与えていたのかを知りたかっただけです。 @ IgnacioVazquez-Abrams –