true - python logica
¿Es incorrecto usar el operador “==” cuando se compara con una lista vacía? (2)
Citando la sección de Recomendaciones de Programación de PEP-8 ,
Para las secuencias (cadenas, listas, tuplas), use el hecho de que las secuencias vacías son falsas.
Yes: if not seq: if seq: No: if len(seq) if not len(seq)
Ya que las secuencias vacías son Falsy en Python,
>>> bool([])
False
>>> bool(())
False
simplemente puede utilizar if not
como se menciona en el PEP-8.
Nota: Nunca debe usar is
para comparar si dos valores son iguales, ya is
operador verifica si dos objetos son uno y el mismo, pero ==
comprueba si dos objetos son iguales.
Busqué en el código fuente para averiguar qué está sucediendo. Cuando hacemos a == []
,
>>> dis(compile(''if a == []: pass'', "string", "exec"))
1 0 LOAD_NAME 0 (a)
3 BUILD_LIST 0
6 COMPARE_OP 2 (==)
9 POP_JUMP_IF_FALSE 15
12 JUMP_FORWARD 0 (to 15)
>> 15 LOAD_CONST 0 (None)
18 RETURN_VALUE
estamos construyendo una nueva lista y sería una operación muy costosa, solo para comparación. Por otra parte
>>> dis(compile(''if not a: pass'', "string", "exec"))
1 0 LOAD_NAME 0 (a)
3 POP_JUMP_IF_TRUE 9
6 JUMP_FORWARD 0 (to 9)
>> 9 LOAD_CONST 0 (None)
12 RETURN_VALUE
estamos tratando de ver si la secuencia actual podría ser Truthy. Esto verifica internamente si la longitud de la secuencia es cero (que es solo una búsqueda simple, ya que la longitud de la lista se mantiene en una variable). Si la longitud es cero, entonces if not actions:
será Truthy. Aquí no construimos una nueva lista, sino que simplemente estamos verificando la longitud implícitamente, en lugar de hacerlo explícitamente
if len(actions) == 0:
Por lo tanto, supongo que los gurús de Python están sugiriendo, if not seq
porque también podría haber una ventaja de rendimiento.
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo verifico si una lista está vacía? 35 respuestas
PyCharm (4.0.6) se queja cuando hago una comparación con una lista vacía usando el operador ==
, pero no cuando uso el operador is
:
Supongo que esto es algo relacionado con PEP 8, pero el problema es que cuando uso el operador is
, como sugiere PyCharm, tengo un falso negativo. Aquí hay un ejemplo simple en el shell de iPython para mostrar que en este caso el operador ==
parece más apropiado, ya que el operador is
devuelve un falso negativo:
In[2]: actions = []
In[3]: actions == []
Out[3]: True
In[4]: actions is []
Out[4]: False
¿Podría alguien explicar por qué PyCharm se queja sobre el operador ==
cuando se compara con una lista vacía? ¿Estoy haciendo algo mal según PEP 8?
Según el documento PEP8 debes usar
For sequences, (strings, lists, tuples), use the fact that empty sequences are false.
Yes: if not seq:
if seq:
No: if len(seq)
if not len(seq)