Ответ 1
Цитата Раздел рекомендаций по программированию PEP-8,
Для последовательностей (строки, списки, кортежи) используйте тот факт, что пустые последовательности являются ложными.
Yes: if not seq: if seq: No: if len(seq) if not len(seq)
Так как пустые последовательности являются Falsy в Python,
>>> bool([])
False
>>> bool(())
False
вы можете просто использовать if not
, как указано в PEP-8.
Примечание.. Вы не должны использовать is
для сравнения, если два значения равны, потому что оператор is
проверяет, являются ли два объекта одинаковыми, но ==
проверяет, равны.
Я вникнул в исходный код, чтобы выяснить, что происходит. Когда мы делаем 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
мы строим новый список, и это будет очень дорогостоящая операция, просто для сравнения. С другой стороны,
>>> 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
мы пытаемся выяснить, может ли текущая последовательность быть Truthy. Это внутренне проверяет, равна ли длина последовательности (это просто простой поиск, так как длина списка поддерживается в переменной). Если длина равна нулю, то if not actions:
будет Truthy. Здесь мы не строим новый список, но мы просто проверяем длину неявно, вместо того, чтобы явно делать
if len(actions) == 0:
Итак, я предполагаю, что гуру Python предлагают if not seq
, потому что также может быть преимущество в производительности.