Python中的==和is的区别

Python中is

Python中的is用来判断两个对象是否是同一个对象, 简单来说, 就是你通过使用Python中的id()函数去获取两个对象的内存地址, 如果地址相同, 即为同一个对象

1
2
3
4
5
6
7
8
>>> a = "abc"
>>> b = a
>>> id(a)
4363614224
>>> id(b)
4363614224
>>> a is b
True
1
2
3
4
5
6
7
8
>>> a = "abc"
>>> b = "abc"
>>> id(a)
4408735760
>>> id(b)
4408735760
>>> a is b
True

在Python的内部有一种intern机制, 在创建小段字符串和一定范围内的整型对象的时候, 会去建立一个全局唯一的对象, 当有其他”标签”(变量)引用到这个对象的时候, 不会重新生成一个新的对象, 而是会复用这个对象, 所以上面的例子🌰中, 虽然单独为两个变量赋值了短字符串, 但是他们实际指向的还是同一个对象, 同一块内存

1
2
3
4
5
6
7
8
>>> a = 1.1
>>> b = 1.1
>>> id(a)
4420807080
>>> id(b)
4420807488
>>> a is b
False

可以看到, Python中的intern机制只适用于小整数或短字符串, 同样为基础数据类型的浮点型, 也是不支持的

1
2
3
4
5
6
7
8
>>> a = [1, 2]
>>> b = [1, 2]
>>> id(a)
4428278664
>>> id(b)
4428154376
>>> a is b
False
1
2
3
4
5
6
7
8
>>> a = [1, 2]
>>> b = a
>>> id(a)
4432739208
>>> id(b)
4432739208
>>> a is b
True

Python中的==

Python中的==用来判断两个变量的值是否相等, 而不会纠结于两个变量的对象是否为同一个对象

1
2
3
4
>>> a = 1.1
>>> b = 1.1
>>> a == b
True

上面的例子中, 使用is判断的话, 两个对象是两个单独的对象, 但是使用==判断的话, 只是判断他们的值是否相等, 显而易见, 虽然存放在不同的内存地址上, 但是他们的值是相等的

魔法函数__eq__

==的判断实际上是由类中的__eq__这个魔法函数来实现的

1
2
3
4
5
6
7
8
9
10
11
12
class A:
def __init__(self, name):
self.name = name

def __eq__(self, obj):
return self.name == obj.name


a = A(name="larry")
aa = A(name="larry")

print(a == aa)

执行结果:

1
True