¿Hay alguna diferencia entre:
if foo is None: pass
y
if foo == None: pass
La convención que he visto en la mayoría del código Python (y el código que yo mismo escribo) es la primera, pero recientemente encontré un código que usa la segunda. None es una instancia (y la única instancia, IIRC) de NoneType, por lo que no debería importar, ¿verdad? ¿Hay alguna circunstancia en la que podría?

isoperador no se puede personalizar (sobrecargado por una clase definida por el usuario).__eq__(self)es un método integrado especial que determina cómo==se maneja cuando se usa en un objeto Python. Aquí lo hemos anulado para que cuando==se usa en objetos de tipoFoosiempre devuelva verdadero. No existe un método equivalente para elisoperador, por lo que el comportamiento deisno se puede cambiar de la misma manera.Es posible que desee leer la identidad y equivalencia de este objeto .
La declaración 'es' se usa para la identidad del objeto, verifica si los objetos se refieren a la misma instancia (misma dirección en la memoria).
Y la declaración '==' se refiere a la igualdad (mismo valor).
fuente
a=1;b=1;print(a is b) # True. ¿Alguna idea de por quéa is bresulta ser cierto incluso si parecen ser 2 objetos diferentes (diferentes direcciones en la memoria)?Una palabra de precaución:
No es exactamente lo mismo que:
La primera es una prueba de valor booleano y se puede evaluar como falsa en diferentes contextos. Hay varias cosas que representan falso en un valor booleano, por ejemplo, contenedores vacíos, valores booleanos. Ninguno también se evalúa como falso en esta situación, pero otras cosas también.
fuente
(ob1 is ob2)igual a(id(ob1) == id(ob2))fuente
isversión no necesita una llamada a la función y ninguna búsqueda de atributos del intérprete de python; el intérprete puede responder de inmediato si ob1 es, de hecho, ob2.{} is {}es falso yid({}) == id({})puede ser (y está en CPython) verdadero. Ver stackoverflow.com/questions/3877230La razón
foo is Nonees que la forma preferida es que puede estar manejando un objeto que define el suyo__eq__y que define que el objeto es igual a Ninguno. Por lo tanto, use siemprefoo is Nonesi necesita ver si es de hechoNone.fuente
No hay diferencia porque los objetos que son idénticos, por supuesto, serán iguales. Sin embargo, PEP 8 establece claramente que debe usar
is:fuente
ispruebas de identidad, no igualdad. Para su declaraciónfoo is none, Python simplemente compara la dirección de memoria de los objetos. Significa que está haciendo la pregunta "¿Tengo dos nombres para el mismo objeto?"==por otro lado, prueba la igualdad según lo determinado por el__eq__()método. No le importa la identidad.Nonees un operador singleton. EntoncesNone is Nonesiempre es cierto.fuente
Para Ninguno no debería haber una diferencia entre igualdad (==) e identidad (es). NoneType probablemente devuelve identidad para igualdad. Dado que None es la única instancia que puede hacer de NoneType (creo que esto es cierto), las dos operaciones son las mismas. En el caso de otros tipos, este no es siempre el caso. Por ejemplo:
Esto imprimiría "Igual" ya que las listas tienen una operación de comparación que no es la devolución de identidad predeterminada.
fuente
@ Jason :
No me gusta usar "if foo:" a menos que foo realmente represente un valor booleano (es decir, 0 o 1). Si foo es una cadena o un objeto u otra cosa, "if foo:" puede funcionar, pero me parece un atajo vago. Si está verificando si x es None, diga "if x is None:".
fuente
if foodevolverá falso y el comentario#foo is Nonees incorrecto.Algunos detalles más:
La
iscláusula realmente comprueba si los dosobjects están en la misma ubicación de memoria o no. es decir, si ambos apuntan a la misma ubicación de memoria y tienen la mismaid.Como consecuencia de 1,
isasegura si los dosobjects representados léxicamente tienen atributos idénticos (atributos-de-atributos ...) o no.Creación de instancias de tipos primitivos como
bool,int,string(con alguna excepción),NoneTypeque tienen un mismo valor será siempre en la misma posición de memoria.P.ej
Y dado
NoneTypeque solo puede tener una instancia de sí mismo en la tabla de "búsqueda" de Python, por lo tanto, el primero y el segundo son más un estilo de programación del desarrollador que escribió el código (tal vez por coherencia) en lugar de tener alguna razón lógica sutil para elige uno sobre el otro.fuente
some_string is "bar"para comparar cadenas NUNCA. NO HAY UNA SOLA RAZÓN ACEPTABLE para hacerlo y se ROMPERÁ cuando no lo espere. El hecho de que funcione a menudo es simplemente porque CPython sabe que sería estúpido crear dos objetos inmutables que tengan el mismo contenido. Pero puede suceder no obstante.int, ¿verdad?La conclusión de John Machin de que
Nonees un singleton es una conclusión respaldada por este código.Dado que
Nonees un singleton,x == Noneyx is Nonetendría el mismo resultado. Sin embargo, en mi opinión estética,x == Nonees lo mejor.fuente
Noneobjeto. En comparación, rara vez se ve que ninguno se usa en ningún otro contexto, excepto para ser similar a laFalseverdad con otros valores. En esos casos, es más idiomático hacer algo comoif x: passfuente