2012-03-21 8 views
5

間のPython 3.xではかなりの差がある:は」 '==ない' との間に論理的な違いは、(あるなし)=あり

for each_line in data_file: 
    if each_line.find(":") != -1: 
     #placeholder for code 
     #more placeholder 

for each_line in data: 
    if not each_line.find(":") == -1: 
     #placeholder for code 
     #more placeholder 

私は、質問は上記の使用法に特有ではありませんが、より一般的または必須です。結果が同じであっても、この構文上の違いは異なる方法で動作していますか?論理的な違いはありますか?一つがより適切であるか、これだけが文体的に異なるのですか?これが単に文体的なものであれば、どちらがPythonプログラマーによってより洗練されたものと考えられますか?

また、上記の相違点は、is==の間に違いがあるかどうかを確認することですか?前者は、後者のように、オブジェクトアイデンティティーとオブジェクト価値の平等の違いですか?上記の例では、not暗黙のうちにisが使用されていますか?

答えて

6

を、 機能的に彼らは全く同じではありません。あなたは、クラスに対して比較する場合、クラスは比較演算子を使用するときに呼び出されるメンバ関数、__ne__を持っている可能性が!=、この例では、比較==を使用した場合

そう呼ばれている__eq__とは対照的に、 、
not (a == b)が上__eq__を呼ぶだろう、引数としてBと、その後、not結果
(a != b)は、引数としてBと、上の__ne__を呼び出します。

私は比較のために

+0

ありがとう、これは私には完璧な意味があり、それは論理の問題に答える。 – gogolgadgets

1

あなたの最初の例では、findの結果をテストする方法です。

あなたの第二の例では、あまりにも多くをやっています。 each_line.find(":") == -1式の結果に対してさらにboolean notを実行しています。あなたはtruthinessやfalsinessをテストすることができる何かを持っているときにnotを使用する場合は、この文脈では

は、あります。例えば
は、空の文字列''はFalseに評価されます。

s = '' 
if not s: 
    print('s is the empty string') 

あなたはブールnotで少しアイデンティティ・テスト式isis notをconflatingているように見えます。

あなたがアイデンティティのテストを実行したい方法の例:私はそれを理解したよう

result_of_comparison = each_line.find(":") == -1 
if result_of_comparison is False: # alternatively: is not True 
    pass 
+0

ありがとう、これは私が実用的で文章の違いを理解するのに役立ちました。 – gogolgadgets

4

異なるrich comparison方法は、あなたが==!=を使用するかどうかに応じて呼ばれている(!=を使用して)最初のメソッドを使用します。

class EqTest(object): 
    def __eq__(self, other): 
     print "eq" 
     return True 
    def __ne__(self, other): 
     print "ne" 
     return False 

a = EqTest() 
b = EqTest() 

print not (a == b) 
# eq 
# False 
print a != b 
# ne 
# False 

私の知る限りでは、あなたはすべてのビルトインタイプで同じ結果を得るだろうが、理論的には、彼らはいくつかのユーザー定義オブジェクトのための異なる実装を持つことができます。

not==の代わりに!=を使用するのは、2つではなく1つの操作だからです。

+0

+1は、私のものよりも質問にぴったりの答えです。 – bernie

関連する問題