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)
|
执行结果: