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