Answers:
is
True
如果比较相同的对象实例,则始终返回
而==
最终由该__eq__()
方法确定
即
>>> class Foo(object):
def __eq__(self, other):
return True
>>> f = Foo()
>>> f == None
True
>>> f is None
False
is
操作符无法自定义(由用户定义的类重载)。
__eq__(self)
是一种特殊的内置方法,该方法确定==
在Python对象上使用时如何处理。在这里,我们重写了它,以便在==
类型对象上使用Foo
它时始终返回true。is
运算符没有等效的方法,因此is
无法以相同的方式更改的行为。
(ob1 is ob2)
等于 (id(ob1) == id(ob2))
is
版本不需要函数调用,也完全不需要python-解释器属性查找;如果ob1实际上是ob2,则解释器可以立即回答。
is
测试身份,而不是平等。对于您的声明foo is none
,Python只是比较对象的内存地址。这意味着您要问的问题是“同一对象有两个名称吗?”
==
另一方面,根据__eq__()
方法确定是否相等。它不在乎身份。
In [102]: x, y, z = 2, 2, 2.0
In [103]: id(x), id(y), id(z)
Out[103]: (38641984, 38641984, 48420880)
In [104]: x is y
Out[104]: True
In [105]: x == y
Out[105]: True
In [106]: x is z
Out[106]: False
In [107]: x == z
Out[107]: True
None
是单例运算符。所以None is None
总是真。
In [101]: None is None
Out[101]: True
@ 杰森:
我建议按照以下方式使用更多内容
if foo: #foo isn't None else: #foo is None
我不喜欢使用“ if foo:”,除非foo真正表示一个布尔值(即0或1)。如果foo是字符串或对象或其他对象,则“ if foo:”可能有效,但对我来说似乎是一个懒惰的快捷方式。如果要检查x是否为None,请说“如果x为None:”。
if foo
将返回false并且注释#foo is None
错误。
一些更多的细节:
该is
子句实际上检查两个object
s是否在相同的内存位置。即它们是否都指向相同的内存位置并具有相同的id
。
作为1的结果,请is
确保两个词法表示的object
s是否具有相同的属性(attributes-of-attributes ...)
原始类型等的实例bool
,int
,string
(有一些例外),NoneType
具有相同的值将总是在相同的存储位置。
例如
>>> int(1) is int(1)
True
>>> str("abcd") is str("abcd")
True
>>> bool(1) is bool(2)
True
>>> bool(0) is bool(0)
True
>>> bool(0)
False
>>> bool(1)
True
而且由于NoneType
在python的“查找”表中只能有一个自己的实例,因此前者和后者更像是编写代码的开发人员的编程风格(也许是为了保持一致性),而不是出于任何逻辑上的原因选择一个。
some_string is "bar"
用来比较字符串。这样做没有一个可以接受的理由,当您不期望这样做时,它就会崩溃。它经常工作的事实仅仅是因为CPython知道创建两个具有相同内容的不可变对象是愚蠢的。但这仍然可能发生。
int
,对吗?
约翰·马钦(John Machin)得出的结论None
是单例,这一结论得到了该代码的支持。
>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>>
由于None
是单身,x == None
并且x is None
将有同样的结果。但是,从我的美学观点来看,x == None
是最好的。
None
对象。相比之下,很少有人看到None在其他任何上下文中都没有使用,只是False
与其他值是真实的相似。在那种情况下,做类似的事情会更惯用if x: pass