两个字符串变量被设置为相同的值。s1 == s2总是返回True,但s1 = s2有时返回False。
如果我打开我的Python解释器,并做同样的比较,它成功了:
>>> s1 = 'text'
>>> s2 = 'text'
>>> s1 is s2
True
为什么会这样?
两个字符串变量被设置为相同的值。s1 == s2总是返回True,但s1 = s2有时返回False。
如果我打开我的Python解释器,并做同样的比较,它成功了:
>>> s1 = 'text'
>>> s2 = 'text'
>>> s1 is s2
True
为什么会这样?
当前回答
is关键字是测试对象身份,而==是值比较。
如果使用is,当且仅当对象是同一对象时,结果将为真。但是,当对象的值相同时,==将为真。
其他回答
is关键字是测试对象身份,而==是值比较。
如果使用is,当且仅当对象是同一对象时,结果将为真。但是,当对象的值相同时,==将为真。
根据我有限的Python使用经验,is用于比较两个对象,以确定它们是否是相同的对象,而不是具有相同值的两个不同对象。==用于确定两个值是否相同。
这里有一个很好的例子:
>>> s1 = u'public'
>>> s2 = 'public'
>>> s1 is s2
False
>>> s1 == s2
True
s1是Unicode字符串,s2是普通字符串。它们不是相同的类型,但它们的值相同。
is是身份测试,==是相等测试(请参阅Python文档)。
在大多数情况下,如果a是b,那么a == b。但也有例外,例如:
>>> nan = float('nan')
>>> nan is nan
True
>>> nan == nan
False
所以,你只能在同一性测试中使用is,而不是相等性测试。
这是一个边注,但在惯用的Python中,你经常会看到这样的东西:
if x is None:
# Some clauses
这是安全的,因为保证有一个Null对象的实例(即None)。
Is是同一性测试,==是相等性测试。这意味着is是一种检查两件事物是否相同或等价的方法。
假设你有一个简单的person对象。如果它的名字是“Jack”,而且是“23岁”,那么它就相当于另一个23岁的Jack,但它不是同一个人。
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return self.name == other.name and self.age == other.age
jack1 = Person('Jack', 23)
jack2 = Person('Jack', 23)
jack1 == jack2 # True
jack1 is jack2 # False
他们年龄相同,但他们不是同一个人。一个字符串可能与另一个字符串等价,但它不是同一个对象。