【问题标题】:Difference between 'not x' and 'x==None' in pythonpython中'not x'和'x == None'之间的区别
【发布时间】:2013-06-19 15:07:38
【问题描述】:

如果x 是类实例,not xx==None 可以给出不同的答案吗?

我的意思是如果x 是类实例,not x 是如何评估的?

【问题讨论】:

  • 您的班级是否有__nonzero__ 方法(或3.x 中的__bool__)?
  • 如果x = False 至少会这样。
  • 请记住,如果您要与 None 进行比较,您应该这样做 x is None

标签: python


【解决方案1】:

是的,它可以给出不同的答案。

x == None

将调用__eq__() 方法来评估运算符并给出与None 单例相比实现的结果。

not x

将调用__nonzero__()(python3 中的__bool__())方法来评估运算符。解释器将使用上述方法将x 转换为布尔值(bool(x)),然后由于not operator 而反转其返回值。

x is None

表示引用 x 指向 None 对象,该对象是 NoneType 类型的单例,并且在比较中将评估为 false。 is operator 测试对象身份,因此比较的两个对象是否是对象的相同实例,而不是相似对象。

【讨论】:

  • 请注意,您不应使用x == None,而应使用x is None
  • @Cthulhu x == Nonex is None 永远不会导致不同的答案。但是,由于None 是一个单例实例,因此使用is None 被认为是更好的做法。
  • @arshajii x == Nonex is None 如果实现对象的 __eq__ 返回 True(出于某种原因),则可能返回不同的答案,但对象本身不是 None
  • @Cthulhu 是的,如果x 是一个糟糕的类的实例,它严重地定义了__eq__。但是arshajii的理由更好。
  • 是的,should never 不同于 can never 我想。
【解决方案2】:
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

【讨论】:

    【解决方案3】:

    是的; not uses __bool__(在 Python 3 中;Python 2 使用 __nonzero__),并且 x == None 可以被 __eq__ 覆盖。

    (Both are shown here.)

    【讨论】:

      【解决方案4】:

      如果x,则not 表示,反之亦然。

      x == None 表示只有在 x is NoneTrue 时才会为 True,否则为 False。检查this

      我所说的肯定是指选择了if 块。 True 也是正面的。

      【讨论】:

        【解决方案5】:

        not x 适用于多种值,例如0""[] {}

        x == None 仅适用于一个特定值 None

        如果 x 是一个类实例,那么 not xx == None 都将为 false,但这并不意味着它们是等价的表达式。


        很好;上一段应为:

        如果 x 是一个类实例,那么 not xx == None 都将为 false,除非有人在使用类定义玩傻瓜。

        【讨论】:

        • If x is a class instance, then both not x and x == None will be false, but that doesn't mean that those are equivalent expressions. - 这根本不是真的,类实例可以评估为FalseNone
        • 除了显式分配None 之外,类实例何时评估为None?你的意思是,当__eq__ () 返回None
        • 你的回答开始不错。
        • 好的,我从 Ashwini 上面的回答中看到,可以制作一个“not x”为真且“x == None" 是真的,但除了证明它是可能的之外,我看不出它有什么用处。
        • 其实,现在想想,我可以想象很多情况下,类对象可以被认为是“零”;例如一个数字类,如复数或四元数。
        猜你喜欢
        • 1970-01-01
        • 2012-10-06
        • 1970-01-01
        • 2011-02-12
        • 1970-01-01
        • 2013-06-14
        • 2011-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多