访问量: 10 次浏览
在 Python 中比较对象时,身份运算符 is 经常被误用于相等运算符 == 的位置。
实际上,当比较数据时,很少应该使用 is。Python 中的身份运算符 is 和相等运算符 == 在语义上有本质区别。
使用 is 来比较数字时,代码可能偶尔"正常"运行,但这种行为并不可靠。
虽然 is 运算符理论上比 == 更快,或被认为更加"Pythonic",但重要的是要记住,这两个运算符的行为方式并不相同。
== 运算符Python 的相等运算符 == 用于比较对象的值(value)。它在左侧对象上调用 __eq__() 方法,该方法定义了判断相等的标准。
如果两个对象的值相同,== 返回 True,否则返回 False。== 比较两个对象的值,而 is 检查两个对象的身份(identity)。
等于(equal)和相同(identical)的含义并不一样——当理解 Python 的 is 和 == 比较运算符时,这个区别至关重要。
Python 的 is 运算符确定两个或多个变量是否指向同一个内存对象,而 == 运算符比较的是两个对象的值是否相等。
这意味着,除了与 None 比较的情况外,几乎总是应该使用 == 和 != 运算符。
is 运算符在 Python 中使用身份运算符(is、is not)可以比较对象的身份。
如果运算符两边的变量指向完全相同的对象,is 的求值结果为 True,否则为 False。
为了确定两个或多个变量是否引用同一个对象,可以使用 is 关键字。只有当变量被赋予某些值时,is 运算符才能正常工作。
当比较两个对象的身份时,使用 is 操作符。而当比较两个对象的值时,使用 == 操作符。
理解 Python 中 == 和 is 的区别,关键在于理解"相同"和"相等"这两个概念的差异。
为了进一步理解这一点,来看一个示例:
list_1 = ['a', 'b', 'c']
list_2 = list_1
list_3 = list(list_2)
print(list_1)
print(list_2)
print(list_3)
输出
['a', 'b', 'c']
['a', 'b', 'c']
['a', 'b', 'c']
print(list_1 == list_2)
print(list_1 == list_3)
输出
True
True
这是因为 list_1、list_2 和 list_3 的值相等,所以 == 返回 True。
print(list_1 is list_2)
print(list_1 is list_3)
输出
True
False
在这里可以看到,list_1 is list_3 的结果为 False,因为 list_1 和 list_3 指向两个不同的对象,即使它们包含相同的内容。
这引出了结论:当两个变量指向完全相同的对象时,is 返回 True;而当变量所指向的对象值相等时,== 返回 True。
== 比较的是两个对象的值(value)是否相等。is 比较的是两个对象是否为同一个对象(identity),即内存地址是否相同。== 来比较值,使用 is 来比较 None(如 x is None)。is 来比较数字或字符串,因为 Python 的 small integer caching 或 string interning 可能导致不可预期的行为。