the - true python
Diferencia entre “si x” y “si x no es ninguna” (5)
Parece que "si x" es casi como una mano corta para la sintaxis más larga de "si x no es Ninguno". ¿Son funcionalmente idénticos o hay casos en los que para un valor dado de x los dos evaluarían de manera diferente?
Supondría que el comportamiento también debería ser idéntico en todas las implementaciones de Python, pero si hay diferencias sutiles, sería bueno saberlo.
El primero prueba la veracidad, mientras que el último prueba la identidad con None
. Muchos valores son falsos, como False
, 0
, ''''
y None
, pero solo None
es None
.
En los siguientes casos:
test = False
test = ""
test = 0
test = 0.0
test = []
test = ()
test = {}
test = set()
la prueba if
diferirá:
if test: #False
if test is not None: #True
Este es el caso porque is
pruebas de identidad, es decir,
test is not None
es equivalente a
id(test) == id(None) #False
por lo tanto
(test is not None) is (id(test) != id(None)) #True
Todo en Python tiene un valor bool. Los valores son True, False, None.
todo es verdadero o falso
0 es falso
[], (), {}, '''' son falsos (todo está vacío)
[Falso], (''hola''), ''hola'', etc. son verdaderos (''porque no están vacíos)
Sólo Ninguno es Ninguno.
>>> x = None
>>> if not x:print x #because bool(None) is False
None
>>> if x == None:print x
None
>>> x = False
>>> if not x:print x
False
>>> if x == None:print x
>>>
por último, tenga en cuenta que Verdadero y Falso son versiones "especiales" de 1 y 0 ... por ejemplo
>>>True + 1
2
>>>False + 1
1
>>>range(1, 5)[False]
1
if x:
# Evaluates for any defined non-False value of x
if not x:
# Evaluates for any defined False value of x
if x is None:
# Evaluates for any instances of None
Ninguno es su propio tipo, que resulta ser Falso. "si no es x" evalúa si x = Ninguno, solo porque Ninguno es Falso.
No hay diferencias sutiles que conozca, pero existen métodos exactos para probar el uso de positividad / negatividad en situaciones exactas. Mezclarlos puede funcionar en algunas situaciones, pero puede llevar a problemas si no se entienden.
if x is True:
# Use for checking for literal instances of True
if x is False:
# Use for checking for literal instances of False
if x is None:
# Use for checking for literal instances of None
if x:
# Use for checking for non-negative values
if not x:
# Use for checking for negative values
# 0, "", None, False, [], (), {} are negative, all others are True
x = 0
if x: ... # False
if x is not None: ... # True