verdadero valores operaciones operacion logicas inicializar funcion falso elementos booleanos booleana and python boolean jython cpython pypy

python - inicializar - valores booleanos y operaciones logicas



Identidad Booleana== Verdadero vs Verdadero (6)

Es una convención estándar para usar if foo is None lugar de if foo == None para probar si un valor es específicamente None .

Si desea determinar si un valor es exactamente True (no solo un valor verdadero), ¿hay alguna razón para usar if foo == True lugar de if foo is True ? ¿Esto varía entre implementaciones como CPython (2.x y 3.x), Jython, PyPy, etc.?

Ejemplo: decir True se utiliza como un valor singleton que desea diferenciar del valor ''bar'' , o cualquier otro valor verdadero:

if foo is True: # vs foo == True ... elif foo == ''bar'': ...

¿Hay algún caso donde usar if foo is True arrojaría resultados diferentes if foo == True ?

NOTA: Soy consciente de los booleanos de Python - si x :, frente a si x == verdadero, vs si x es verdadero . Sin embargo, solo aborda si if foo , if foo == True , o if foo is True generalmente se debe usar para determinar si foo tiene un valor verdadero.

ACTUALIZACIÓN: de acuerdo con PEP 285 § Especificación:

Los valores False y True serán singletons, como None.


¿Hay alguna razón para usar si foo == True en lugar de si foo es True? "

>>> d = True >>> d is True True >>> d = 1 >>> d is True False >>> d == True True >>> d = 2 >>> d == True False

Tenga en cuenta que bool es una subclase de int , y que True tiene el valor entero 1 . Para responder a su pregunta, si desea verificar que alguna variable "es exactamente Verdadera", debe usar el operador de identidad. Pero eso realmente no es pitónico ... ¿Puedo preguntar cuál es tu caso de uso real? IOW: ¿por qué quieres hacer una diferencia entre True , 1 o cualquier valor de ''verdad''?


Si desea determinar si un valor es exactamente Verdadero (no solo un valor verdadero), ¿hay alguna razón para usar si foo == True en lugar de si foo es Verdadero?

Si desea asegurarse de que foo realmente es un booleano y de un valor True , use el operador is .

De lo contrario, si el tipo de foo implementa su propio __eq__() que devuelve un valor verdadero al comparar con True , puede terminar con un resultado inesperado.

Como regla general, siempre debe usar is con las constantes integradas True , False y None .

¿Esto varía entre implementaciones como CPython (2.x y 3.x), Jython, PyPy, etc.?

En teoría, será más rápido que == ya que este último debe respetar las implementaciones personalizadas de __eq__ tipos, mientras is puede comparar directamente las identidades de objeto (por ejemplo, direcciones de memoria).

No conozco el código fuente de las diversas implementaciones de Python de memoria, pero supongo que la mayoría de ellos pueden optimizarlo al usar algunas banderas internas para la existencia de métodos mágicos, así que sospecho que no notarán la diferencia de velocidad. en la práctica.


Aquí hay una prueba que le permite ver la diferencia entre las 3 formas de prueba para Verdadero:

for test in ([], [1], 0, 1, 2): print repr(test), ''T'' if test else ''F'', ''T'' if test == True else ''F'', ''T'' if test is True else ''F'' [] F F F [1] T F F 0 F F F 1 T T F 2 T F F

Como puede ver, hay casos en que todos ofrecen resultados diferentes.


La mayoría de las veces, no debería preocuparse por un detalle como este. O bien ya sabes que foo es un booleano (y puedes usar if foo ), o sabes que foo es otra cosa (en cuyo caso no es necesario probarlo). Si no conoce los tipos de sus variables, es posible que desee refactorizar su código.

Pero si realmente necesita estar seguro de que es exactamente True y nada más, el uso is . Usar == le dará 1 == True .


Never use is True en combinación con numpy (y derivados como pandas):

In[1]: import numpy as np In[2]: a = np.array([1, 2]).any() In[4]: a is True Out[4]: False In[5]: a == True Out[5]: True

Esto fue inesperado para mí ya que:

In[3]: a Out[3]: True

Supongo que la explicación viene dada por:

In[6]: type(a) Out[6]: numpy.bool_


editar: re is True vs ==

hay un caso, y es esto:

In [24]: 1 is True Out[24]: False In [25]: 1 == True Out[25]: True

Además, para singletons como valor centinela, puede usar una clase

class SentinelTime(object): pass def f(snth): if snth is SentinelTime: print ''got em!'' f(SentinelTime)

no quiere usar if var == True: realmente desea if var:

imagina que tienes una lista no importa si una lista es " True " o no, solo quiere saber si está vacía o no. asi que...

l = [''snth''] if l: print l

echa un vistazo a esta publicación para lo que se evalúa como False : Evaluación de expresiones booleanas en Python