Разница между 'not x' и 'x= = None' в python



Могут ли not x и x==None давать разные ответы, если x является экземпляром класса ?



Я имею в виду, как вычисляется not x, если x является экземпляром класса ?

377   5  

5 ответов:

Да онможет дать разные ответы.

x == None

Вызовет __eq__() метод для оценки оператора и получения результата реализован по сравнению с None синглетоном.

not x

Вызовет __nonzero__() (__bool__() в python3) метод для вычисления оператора. Интерпретатор преобразует x в булеву (bool(x)), используя указанный метод, а затем инвертирует его возвращаемое значение из-за not оператор .

x is None

Означает, что ссылка x указывает на объект None, который является синглетом типа NoneType и будет иметь значение false в сравнении. Тот самый is оператор проверяет идентичность объекта, и таким образом, являются ли два сравниваемых объекта одним и тем жеэкземпляром объекта, а не подобными объектами.

class A():
    def __eq__(self, other):  #other receives the value None
        print 'inside eq'
        return True
    def __nonzero__(self):    
        print 'inside nonzero'
        return True
...     
>>> x = A()
>>> x == None      #calls __eq__
inside eq
True
>>> not x          #calls __nonzero__
inside nonzero
False

not x является эквивалентным к:

not bool(x)

Py 3.x:

>>> class A(object):
        def __eq__(self, other):    #other receives the value None
                print ('inside eq')
                return True
        def __bool__(self):    
                print ('inside bool')
                return True
...     
>>> x = A()
>>> x == None       #calls __eq__
inside eq
True
>>> not x           #calls __bool__ 
inside bool 
False

Да; not использование __bool__ (в Python 3; Python 2 использует __nonzero__), и x == None может быть переопределен __eq__.

(оба они показаны здесь.)

Если x является положительным, то not означает отрицательным и наоборот.

x == None означает, что он будет только True, если x is None является True Еще ложным. Проверьте это .

Под положительным я подразумеваю, что выбран блок if. True также положительно.

not x справедливо для широкого спектра значений, например:0, Нет, "", Ложь, [], {}, и т.д.

x == None верно только для одного конкретного значения None .

Если x является экземпляром класса, то и not x, и x == None будут ложными, но это не означает, что они эквивалентны выражениям.


Прекрасно; этот предыдущий абзац должен гласить:

Если x является экземпляром класса, то оба not x и x == None будут ложными, если только кто-то не играет в дурацкие игры с определением класса.

Comments

    Ничего не найдено.