2012-03-21 6 views
5

¿Existe una diferencia sustancial en Python 3.x entre:¿Existe una diferencia lógica entre 'no ==' y '= (sin es)

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

y

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

Mi La pregunta no es particular al uso anterior, pero es más general o esencial: ¿esta diferencia sintáctica funciona de manera diferente, aunque el resultado sea el mismo? ¿Hay una diferencia lógica? ¿Hay tareas en las que una sea más adecuada o solo se trata de una diferencia de estilo? Si esto es meramente estilístico, ¿cuál es considerado más limpio por los programadores de Python?

Además, ¿es el ejemplo anterior el que pregunta cuál es la diferencia entre is y ==? ¿Es el primero, como el último, una diferencia de identidad de objeto y de igualdad de valor de objeto? Lo que quiero decir es, en mi ejemplo anterior, ¿está el is usando not implícito?

Respuesta

6

Como yo lo entiendo, funcionalmente que no son del todo la misma; si está comparando contra una clase, la clase podría tener una función miembro, __ne__ que se llama cuando se utiliza el operador de comparación! =, en lugar de __eq__ que se llama cuando se usa la comparación ==

Por lo tanto, en este caso ,
not (a == b) llamarían __eq__ en una, con b como el argumento, entonces el resultado not
(a != b) llamaría __ne__ en una, con b como argumento.

me gustaría utilizar el primer método (usando! =) Para la comparación

+0

gracias, esto tiene perfecto sentido para mí, y responde a la pregunta de la lógica. – gogolgadgets

1

Su primer ejemplo es cómo debe probar el resultado de find.

Su segundo ejemplo es hacer demasiado. También está realizando un boolean not en el resultado de la expresión each_line.find(":") == -1.

En este contexto, donde desea utilizar not es cuando tiene algo que puede comprobar la veracidad o falsedad.
Por ejemplo, la cadena vacía '' se evalúa como falsa:

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

Usted parece ser un poco confundir las expresiones de la prueba de identidad y isis not con el booleano not.

Un ejemplo de cómo le gustaría realizar un ensayo de identidad:

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

gracias, esto me ha ayudado a comprender las diferencias prácticas y estilísticas. – gogolgadgets

4

Diferentes rich comparison métodos se denominan en función de si se utiliza 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 

Por lo que yo sé, obtendrá el mismo resultado para todas las implementaciones diferentes tipos incorporados, pero teóricamente podrían tener para algunos objetos definidos por el usuario.

Usaría != en lugar de not y == simplemente porque es una operación en lugar de dos.

+0

+1 por una respuesta más adaptada a la pregunta que la mía. – bernie

Cuestiones relacionadas