¿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?
is
operador 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 tipoFoo
siempre devuelva verdadero. No existe un método equivalente para elis
operador, por lo que el comportamiento deis
no 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 b
resulta 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
is
versió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 None
es 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 None
si 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
is
pruebas 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.None
es un operador singleton. EntoncesNone is None
siempre 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 foo
devolverá falso y el comentario#foo is None
es incorrecto.Algunos detalles más:
La
is
cláusula realmente comprueba si los dosobject
s 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,
is
asegura si los dosobject
s 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),NoneType
que tienen un mismo valor será siempre en la misma posición de memoria.P.ej
Y dado
NoneType
que 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
None
es un singleton es una conclusión respaldada por este código.Dado que
None
es un singleton,x == None
yx is None
tendría el mismo resultado. Sin embargo, en mi opinión estética,x == None
es lo mejor.fuente
None
objeto. En comparación, rara vez se ve que ninguno se usa en ningún otro contexto, excepto para ser similar a laFalse
verdad con otros valores. En esos casos, es más idiomático hacer algo comoif x: pass
fuente