2012-08-09 15 views
9

me he encontrado un código que lee:¿Hay alguna diferencia entre `if bool (x)` y `if x` en Python?

if bool(x): 
    doSomething 

creo que la siguiente sería hacer el mismo trabajo:

if x: 
    doSomething 

The reference dice que evalúa la suite si la expresión de prueba

se encuentra para ser verdad

La referencia dice de expresiones booleanas:

En el contexto de las operaciones booleanas, y también cuando las expresiones son utilizadas por los estados de flujo de control se utilizan por los estados de flujo de control, los siguientes valores se interpretan como falsa: Falso , Ninguno, cero numérico de todos los tipos, cadenas vacías y contenedores ... Todos los demás valores se interpretan como verdaderos.

El reference dice de la función bool():

convertir un valor de un booleano, usando el procedimiento de prueba verdad norma

Así son los dos anteriores idénticos o hay algo extra sutileza a ella?

+1

Simplemente siga el primer enlace en los documentos sobre if y obtendrá su respuesta. – phant0m

+2

Sé lo que dice la referencia. Es por eso que lo cité. Como dice la referencia, no es una especificación, y estoy preguntando si mi lectura de los documentos es correcta. – Joe

+0

No, lo vincula a _ _nonzero() _ _ – phant0m

Respuesta

7

if usará __nonzero__() si está disponible, al igual que bool() al probar un valor como verdad. Entonces , el comportamiento es equivalente.

De la documentación:

En el contexto de las operaciones booleanas, y también cuando las expresiones son utilizado por las sentencias de control de flujo, los siguientes valores se interpretan como falso: Falso, Ninguno, numérico cero de todos tipos y cadenas vacías y contenedores (incluidas cadenas, tuplas, listas, diccionarios, conjuntos y conjuntos congelados). Todos los demás valores se interpretan como verdaderos. (Véase el método especial __nonzero__() una manera de cambiar esto.)

object.__nonzero__(self)

Llamado para implementar las pruebas de valor de la verdad y la incorporada en el funcionamiento bool(); debe devolver Falso o Verdadero o sus enteros equivalentes 0 o 1. Cuando este método no está definido, se llama a __len__(), si está definido, y el objeto se considera verdadero si su resultado es distinto de cero. Si una clase no define __len__() ni __nonzero__(), todas sus instancias se consideran verdaderas.

+1

Esta no fue la primera respuesta, pero sí contiene un enlace categórico entre las funciones 'if' y' bool() ', por lo que es correcto marcar. – Joe

+2

'__nonzero__' se conoce como' __bool__' en python 3.x. – Darthfett

14

Los objetos se convierten implícitamente a tipo bool cuando se colocan en una instrucción if. Por lo tanto, para la mayoría de los propósitos, no hay diferencia entre x y bool(x) en una declaración if. Sin embargo, incurrirá en gastos adicionales si llama al bool() porque está realizando una llamada a función. Aquí está una prueba rápida para demostrar esto:

In [7]: %timeit if(''): pass 
10000000 loops, best of 3: 21.5 ns per loop 

In [8]: %timeit if(bool('')): pass 
1000000 loops, best of 3: 235 ns per loop 
+2

su código no coincide con los comprobadores de bucles ... uno es 10,000,000 y el otro es 1,000,000 –

+6

@InbarRose: no, esa es la cantidad de veces que 'timeit' entró en bucle. Decidió hacer menos en el segundo caso porque era 10 veces más lento. El 'por lazo' es el número importante. – DSM

+0

@DSM oh, está bien :) –

3

cualquier objeto que se pone en un estado de if se convertirá en un bool basada en algún corrector pitón interno, normalmente no es un problema, no hay ninguna diferencia entre bool(x) y (x) cuando está dentro de una declaración if. Sin embargo

, la razón bool(x) existe es para casos tales como:

return bool(x)

que volver "true o false" basado en el objeto.

0

Afaik no hay diferencia, si x es '', Ninguno, 0 o Falso, se convertirá en False.

+1

Y '[]' y '{}' y 'set()' y ... la lista continúa. (Cualquier objeto puede definirse con un método '__nonzero__' (o' __bool__' para Python 3) y esto controla el comportamiento de 'if x'.) – huon

Cuestiones relacionadas