【问题标题】:In Python, is None a unique object?在 Python 中,None 是唯一的对象吗?
【发布时间】:2016-11-12 08:05:30
【问题描述】:

在我的测试代码中,为什么 tuple 和 None 的 print 结果不同?看起来 a、b 指向同一个对象None,但 c、d 指向不同的对象,尽管它们的值相同(都等于 (a,b))。

我知道is 关键字检查位于后面的对象,而不仅仅是比较像== 这样的值。而这里我使用 tuple 是因为我认为 tuple 是不可变的,所以至少这不是对象是可变还是不可变的问题。

但是为什么变量 a、b 不像 c、d 那样创建并指向两个不同的 None 对象?

a=None
b=None
c=(1,2)
d=(1,2)
print(a is b)
print(c is d)

【问题讨论】:

    标签: python object nonetype


    【解决方案1】:

    None 是一个单例对象:它只能存在一个实例。所以引用None的对象将始终具有相同的标识,并且两个或更多这样的对象将始终通过标识(对象相等性)测试:

    >>> a = None
    >>> b = None
    >>> c = None
    >>> a is b is c
    True
    

    同样适用于TrueFalse

    >>> d = True
    >>> (a is b is c) is d # proof of concept only
    True
    

    【讨论】:

    • 可以肯定的是,对于你所说的None,True和False之类的单例对象,基本上is==工作完全一样?谢谢顺便说一句。
    • 对于布尔值,使用== 进行测试(或对象本身)就足够了,因为对象具有真值和假值。 c = 1 将通过c == True(最好直接使用c,如if c: ...)但不是c is True。请注意,仅当且仅当您打算检查身份而不是相等时才使用 is
    • 等等,a is b is c 什么时候没有被解析为(a is b) is c?我认为这只适用于普通的比较运算符。 编辑: 'a' in 'ab' in 'abc' 也有效
    • @Eric comparisons 可以任意链接。添加分组括号会强制解释器首先评估 () 中的项目,然后再评估其他项目。在链式比较中添加括号时必须更加小心。
    • @MosesKoledoye: in 不在该列表中,但仍然是连锁店
    【解决方案2】:

    None object is a singleton in python. 因此结果。

    而对于cd,它会创建单独的元组。

    从你的例子:

    >>> id(None)
    4454442584
    >>> id(a)
    4454442584
    >>> id(b)
    4454442584
    >>> id(c)
    4463917464
    >>> id(d)
    4463865584
    

    【讨论】:

      【解决方案3】:

      'is' 运算符比较变量后面的对象,如您所想。

      a=None
      b=None
      print(a is b)
      >True #both None are the same instanciations or objects
      

      Python 中的 None 对象是单例 (https://docs.python.org/2/c-api/none.html),因此单例将类的实例化限制为一个对象 (https://en.wikipedia.org/wiki/Singleton_pattern)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-16
        • 1970-01-01
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        相关资源
        最近更新 更多