在说is和==这两个运算符的区别之前,首先要知道Python中对象包含的三个基本元素,即:id(身份)、python type()(数据类型)和value(值)。 is和==都是比较判断对象,只是比较判断对象的内容不同。我们来看看具体的区别。
在 Python 中有两种方法可以比较两个对象是否相等。简而言之,它们的区别如下:
is是比较两个引用是否指向同一个对象(引用比较)。
==是比较两个对象是否相等。
>>> a = [1, 2, 3]
>>> b = a
>>> b is a # a的引用复制给b,他们在内存中其实是指向了用一个对象
True
>>> b == a # 当然,他们的值也是相等的
True
>>> b = a[:] # b通过a切片获得a的部分,这里的切片操作重新分配了对象,
>>> b is a # 所以指向的不是同一个对象了
False
>>> b == a # 但他们的值还是相等的
True
实现原理
is比较的是两者是否是同一个对象,所以比较的是内存地址(id是否相同)。
== 是一个值比较。不可变对象,比如int、str,它会直接比较值。对于 Python 已知的对象,调用它们的 __eq__ 函数进行比较。 (其实已知对象也应该通过内置的 __eq__ 函数进行比较)。对于自定义对象,如果实现了__eq__函数,就会使用它来进行比较。如果没有,效果和==一样。
对象缓存机制
Python 会缓存相对较小的对象。下次它使用比较小的对象时,它会去缓存中查找。如果找到了,就不会开辟新的内存,而是继续给小对象的地址赋新值。例子:
>>> c = 1
>>> d = 1
>>> print(c is d)
True
>>> 1000 is 10**3
False
>>> 1000 == 10**3
True
计算分配不使用缓冲区。正如你从第一个代码示例中看到的那样。
对于字符串,你可以使用 intern 函数强制使用缓冲区
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Python 使用二进制搜索进行排序12/03
- ♥ python正则表达式如何计算元音?11/29
- ♥ python函数和c有什么区别09/08
- ♥ python中函数传递参数的两种方式10/01
- ♥ Calendar 类如何操作 python3 时间迭代器?01/05
- ♥ 常用正则表达式最强整理(速查手册)02/02
内容反馈