•  
  • 1
  •  
0

Чем различаются выражения “foo is None” и “foo == None”?

Любые различия между выражениями:

if foo is None: pass

и

if foo == None: pass

None это объект относящийся к NoneType, так какой же способ будет наиболее правильным?

python.
спросил 1005 дней назад Аватор пользователя Alexandr Alexandr
313 15
изменил 1005 дней назад Аватор пользователя Alexandr Alexandr
313 15
300

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']
    
    Вики-ответ
    изменил 1003 дня назад Аватор пользователя alex alex
    236 7
    •  
    • 1
    •  

    Тот, который описан в PEP-8. Думаю, будет полезно, если вы сами найдёте там ответ :)

    ответил 1005 дней назад Аватор пользователя lorien lorien
    56 1
Чтобы написать ответ, вы должны авторизироваться.