在说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 pep811/17
- ♥ 如何使数组中的元素在python中不重复11/04
- ♥ python中调用父类的三种方法09/12
- ♥ Python浮点数的使用注意事项01/12
- ♥ 带有空格或制表符的 Python 缩进09/12
- ♥ python中的K-NN算法是什么?12/17
内容反馈