Python 的相等比较器是严格的,除了将 1 与 True 以及 0 与 False 进行比较时,1 或 0 的值是 float、decimal.Decimal 还是 long 类型都没有关系。任何数字类型的零(例如 0、0L、0.0、0j)始终为 False。 (请注意,转换为布尔值的任何其他内容都是 True。请参阅 Truth Value Testing in Python。)除复数 (1L, 1.0, 1) 之外的任何类型的 1 始终为 True。
在 Python 中:
0 == '0' # False
0 == '0' and type(0) == type('0') # False, compare short circuits
0 == '' # False
0 == '' and type(0) == type('') # False, compare short circuits
1 == True and type(1) == type(True) # False, makes a difference here
1 == True # True, also true if 1 was 1.00, etc..
0 == False # True
False == None # False
0 == bool(None) # True
当第一个比较返回 False 时,第二个比较不会被评估,因此它会短路,因为 0 和其他任何东西都是 0。但这不是必需的,它只适用于第 6 行中将 1 与 True 进行比较时。
在 JavaScript 中:
0 == '0' //true
0 === '0' //false
0 == '' //true
0 === '0' //false
1 === true //false
1 == true //true
0 == false //true
false == null //false
0 == !!(null) //true
所以最接近 Python 中的 JavaScript === 的是:
a == b and type(a) == type(b)
但只有在与 1 或 0 进行布尔比较的情况下才需要使用,这不太可能。如果您希望一个值是数字或布尔值,您可能需要修复您的代码。一个菜鸟的错误就是发生这样的事情:
a = 0.0 # a valid value, lets assume it comes from a source that can also return None and we have no control over that.
# Should be:
# if a not None:
if a: # a is cast to bool, bool(0.0) is False
print "do something here..."
为了澄清一些困惑,了解 Python 的 is 运算符是一件好事。 Python 有一个 is 运算符,如果 is 的两边都绑定到同一个对象,则返回 True,否则返回 False。使用字符串文字时,对象的生命周期仅针对语句的实例。因此,对字符串字面量执行 is 是安全的,因为如果它们相同,它们将被分配给同一个对象。这也适用于其他不可变类型,如 bool 和所有数字类型:
0 is '0' # False
0 is False # False
0 is 0 # True
当比较两个变量或一个变量和一个文字时,这不能保证有效。
当您创建两个空列表时,您会得到两个不同的对象,因此返回 False:
x = []
y = []
x is y # False
但在这种情况下,这些变量引用同一个列表,并将继续这样做,直到它们被重新分配,或者从另一个中复制一个深拷贝:
x = y = []
x is y # True
x.append(1)
x is y # True
x = [1, ]
x is y # False, even though the value is same
is 运算符正在比较对象的身份,它执行以下操作:
id('0') == id(0)
因此,如果两个对象都引用相同的内存,那么它们引用的是相同的对象,因此必须相同。
最好避免 is 进行严格比较,除非您想检查两个对象是否引用相同的内存。
正如 Simon 的回答所说,Python 的平等哲学与 JavaScript 不同,确实不需要严格的平等比较器。 Python 的相等比较器不像 JavaScripts == 那样松散,但同时它与 === 不完全相同。
只要你清楚任何数字类型的零(0、0L、0.0、0j)总是等于 False 和任何数字类型的 1,除了复数(1, 1L, 1.0) 为真。