请谈谈Python中is 和 == 的区别(写代码演示)
is用于比较两个变量是否引用了同一个内存地址 is 表示的是对象标示符(object identity),作用是用来检查对象的标示符是否一致,也就是比较两个对象在内存中的地址是否一样。
用于比较两个变量的值是否相等, 表示的是相等(equality),是用来检查两个对象是否相等。
is 是检查两个对象是否指向同一块内存空间,而 == 是检查他们的值是否相等。
可以看出,is 是比 == 更严格的检查,is 返回True表明这两个对象指向同一块内存,值也一定相同。
# case 1:对于(比较小)数值型和(比较短)字符串型对象, python的存储机制使得a和b其实指向同一个地址,所以is和==都是True
a = 1
b = 1
print("a={0}, b={1}, a == b result: {2}".format(a, b, a==b))
print("a={0}, b={1}, a is b result: {2}".format(a, b, a is b))
# case 2:对于list、tuple等容器,a和b虽然内容一样,但是是两个不同的对象引用,指向两个不同的内存地址
a = [1, 2]
b = [1 ,2]
print("a={0}, b={1}, a == b result: {2}".format(a, b, a==b))
print("a={0}, b={1}, a is b result: {2}".format(a, b, a is b))
# case 3:实际上可以通过修改对象的__eq__方法改变==的比较方式,自定义一个类,并尝试重写__eq__方法让==一定返回False
class TestA():
def __init__(self, num):
self.num = num
def __eq__(self, obj):
return False
a = TestA(9)
b = TestA(9)
print("a={0}, b={1}, a == b result: {2}".format(a, b, a==b))