2017-09-27 12 views
0

私はPythonでスクリプトを書いている間、直感的な問題を抱えています。はありませんあなたがFOOを見ることができるようにこのオペランドはなぜFalseを返しますか?

>>> def foo(): 
...  return False 
... 
>>> foo() 
False 
>>> foo()==False 
True 
>>> i=1 
>>> i!=0 
True 
>>> foo()==False & i!=0 
False 
>>> (foo()==False) & i!=0 
True 
>>> 

()== Falseを戻りとして私!= 0、そう直感的に、私は、しかしとき、真&真を返すことを期待しますfoo()== False & i!= 0(foo()== False)& i!= 0私は最初に期待通りにTrueを取得します。ここで何が起こっているのですか?

答えて

2

操作の単純なピトンの順序です。

foo()==False & i!=0 

ビット単位と&==よりも優先順位が高いです。あなたは論理的かつandであなたのビット単位と&を交換する場合、期待どおりしたがって、あなたが本当に

foo()==(False & i)!=0 

を評価している、あなたの答えは

>>> foo()==False and i!=0 
True 

はそれhere

1

&は、==!=よりも優先度が高いため、(foo()==False) & (i!=0)を使用して、オペランドの優先順位の競合が発生しないようにしてください。

foo()==False & i!=0 ==>foo()==(False & i)!=0

1

理由は、(&)ビット単位よりも低い優先順位を有し、doc:

比較する(==,!=)を参照して、Pythonでの演算子の優先順位があることです(foo()==False) & i!=0 ==>((foo()==False) & i)!=0

0

&についてもっと知ろ出てきますBitwise演算子なので、数値を偶数か奇数かを調べることができます。 foo()は0と見なされ、0は奇数とはみなされないFalseを返すため、&は奇数ではないためFalseを返します。

0

pythonのドキュメントに従って6.16。演算子の優先順位& iは偽& == ==またはので!= あなたがfooを(実行)よりも優先順位が高い

falseです
foo()==False & i!=0 
foo() == (False & True)!= 0 #since 1 is nothing but True 
Foo() == False != False 

を次のように!= 0が評価されます。

https://docs.python.org/3/reference/expressions.html#summary

私が最初にテーブルを含めることを試みたが、stackoverflowの中でそれを行う方法を知りません。ごめんなさい。

関連する問題