如果是类实例not x
,可以x==None
给出不同的答案吗?x
我的意思是如果是类实例,如何not x
评估?x
是的,它可以给出不同的答案。
x == None
将调用该__eq__()
方法来评估运算符并与单例相比给出实现的结果None
。
not x
将调用__nonzero__()
(__bool__()
在 python3 中) 方法来评估运算符。解释器将使用上述方法转换x
为 boolean( ),然后由于操作符而反转其返回值。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)
派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__
.
not x
适用于多种值,例如0、None、""、False、[]、{}等。
x == None
仅适用于一个特定值None。
如果x是一个类实例,那么两者not x
和x == None
都将为假,但这并不意味着它们是等价的表达式。
美好的; 前一段应改为:
如果x是一个类实例,那么两者not x
和x == None
都将是假的,除非有人在用类定义玩愚蠢的虫子。