- 1
Чем различаются выражения “foo is None” и “foo == None”?
Любые различия между выражениями:
if foo is None: pass
и
if foo == None: pass
None это объект относящийся к NoneType, так какой же способ будет наиболее правильным?
2 ответа:
-
- 6
Вики-ответВ Питоне все переменные — ссылки (указатели) на объекты. Причем если объект принадлежит к неизменяемому типу, то в памяти он будет всего один, а все переменные, которым он присвоен, будут ссылаться на него. Простейший пример:
>>> a = 1 >>> b = 1 >>> a is b TrueТ.е. объект, хранящий число 1 находится в памяти в единственном экземпляре, а a и b являются одинаковыми указателями на адрес в памяти этого объекта.
Проверки is и is not сравнивают ссылки, а == и != — сами объекты. Объект None неизменяемый. Поэтому проверки is будут быстрее проверок ==. А если в объекте сравнения (foo) переопределены операции сравнения, то результат вообще может быть непредсказуем.
Поэтому правильный вариант: сравнивать с использованием is и is not. А в PEP-8 вообще рекомендуется никогда не использовать операторы сравнения в такой ситуации.
Кстати, там же обращается внимание на то что не следует подменять условия и использовать if x , если имеется в виду if x is not None. Иначе вот что может получиться:
>>> def modi_list(lst=None): if lst: lst.append('hello') >>> def modi_list2(lst=None): if lst is not None: lst.append('hello') >>> l = list() >>> modi_list(l) >>> l [] >>> l = list() >>> modi_list2(l) >>> l ['hello'] -
- 1
Тот, который описан в PEP-8. Думаю, будет полезно, если вы сами найдёте там ответ :)