知行编程网知行编程网  2022-12-22 11:30 知行编程网 隐藏边栏  9 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于详细分析Python中运算符"=="和"is"的差别的相关知识,包括python中=和==的区别,以及python中的运算符优先级问题这些编程知识,希望对大家有参考作用。

Python中运算符“=”和“is”的区别详解

在说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 函数强制使用缓冲区

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享