2012-03-21 11 views
5

C'è una differenza sostanziale in Python 3.x tra:C'è una differenza logica tra 'non ==' e '= (senza è)

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

e

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

mio la domanda non è specifica dell'uso sopra, ma è più generale o essenziale - questa differenza sintattica funziona in modo diverso, anche se il risultato è lo stesso? C'è una differenza logica? Ci sono compiti in cui uno è più appropriato o è solo una differenza stilistica? Se questo è semplicemente stilistico, quale è considerato più pulito dai programmatori Python?

Inoltre, il precedente è un esempio opposto di chiedere qual è la differenza tra is e ==? Il primo, come quest'ultimo, è una differenza di identità dell'oggetto e uguaglianza del valore dell'oggetto? Quello che intendo è, nel mio esempio precedente, è il is nell'uso implicito di ?

risposta

6

Da quanto ho capito, funzionalmente essi non sono del tutto lo stesso; se stai confrontando una classe, la classe potrebbe avere una funzione membro, __ne__ chiamata quando si utilizza l'operatore di confronto! =, al contrario di __eq__ che viene chiamata quando si utilizza il confronto ==

Quindi, in questo caso ,
not (a == b) definirebbero __eq__ su una, con b come argomento, allora il risultato not
(a != b) richiederebbe __ne__ su una, con b come argomento.

Vorrei utilizzare il primo metodo (utilizzando! =) Per il confronto

+0

grazie, questo ha perfettamente senso per me, e risponde alla domanda di logica. – gogolgadgets

1

Il primo esempio è come si dovrebbe testare il risultato di find.

Il tuo secondo esempio sta facendo troppo. Esegue inoltre un boolean not sul risultato dell'espressione each_line.find(":") == -1.

In questo contesto, dove si desidera utilizzare not è quando si dispone di qualcosa che è possibile verificare per verità o falsità.
Ad esempio, la stringa vuota '' restituisce false:

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

Sembra che tu stia confondendo un po 'le espressioni dell'identità-test is e is not con il booleano not.

Un esempio di come si sarebbe effettuare una prova di identità:

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

grazie, questo mi ha aiutato a capire le differenze pratiche e stilistiche. – gogolgadgets

4

Diversi rich comparison metodi vengono chiamati a seconda se si utilizza == o !=.

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 

Per quanto ne so, si otterrà lo stesso risultato per tutte le implementazioni differenti tipi predefiniti, ma in teoria avrebbero potuto avere per alcuni oggetti definiti dall'utente.

Vorrei utilizzare != anziché not e == semplicemente perché è un'operazione anziché due.

+0

+1 per una risposta più personalizzata rispetto alla mia. – bernie

Problemi correlati