Python 中的比较:is 与 ==
在Python中会用到对象之间比较,可以用==,也可以用is。但是它们的区别是什么呢?
is比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同。莱布尼茨说过:“世界上没有两片完全相同的叶子”,这个is正是这样的比较,比较是不是同一片叶子(即比较的id是否相同,这id类似于人的身份证标识)。
==比较的是两个对象的内容是否相等,即内存地址可以不一样,内容一样就可以了。这里比较的并非是同一片叶子,可能叶子的种类或者脉络相同就可以了。默认会调用对象的__eq__()方法。
可以通过如下例子来区分比较下:
>>>a=["I","love","Python"]
>>>b=a
#a的引用复制给b,在内存中其实是指向了用一个对象
>>>bisa
True
>>>id(a)
46381384
>>>id(b)
46381384
#当然,内容也肯定是相等的
>>>b==a
True
可以发现b和a的内存地址是相同的,它们指向同一块内存,因而is和==的结果都为True。这是因为直接赋值都是赋值的引用,是引用,是引用,重要的事情说三遍。但如果不是通过引用赋值,而是通过切片赋值呢?
#b通过切片操作重新分配了对象,但是值和a相同
>>>b=a[:]
>>>bisa
False
>>>id(a)
48740680
>>>id(b)
48740680
>>>b==a#但他们的值还是相等的
True
新建对象之后,b和a指向了不同的内存,所以bisa的结果为False,而b==a的结果为True。在这里,小编提一个问题,b[0]isa[0]的结果呢?
答案是True。因为切片拷贝是浅拷贝,列表中的元素并未重新创建。不理解的同学请翻看之前的文章Python中的浅拷贝与深拷贝。
通常,我们关注的是值,而不是内存地址,因此Python代码中==出现的频率比is高。但是什么时候用is呢?
is与==相比有一个比较大的优势,就是计算速度快,因为它不能重载,不用进行特殊的函数调用,少了函数调用的开销而直接比较两个整数id。而a==b则是等同于a.__eq__(b)。继承自object的__eq__方法比较两个对象的id,结果与is一样。但是多数Python的对象会覆盖object的__eq__方法,而定义内容的相关比较,所以比较的是对象属性的值。
在变量和单例值之间比较时,应该使用is。目前,最常使用is的地方是判断对象是不是None。下面是推荐的写法:
aisNone
判断不是None的推荐写法是:
aisnotNone
Python会对比较小的整数对象进行缓存,下次用的时候直接从缓存中获取,所以is和==的结果可能相同:
>>>a=1
>>>b=1
>>>aisb
True
>>>a==b
True
而看一下另外一段代码:
>>>a=257
>>>b=257
>>>aisb
False
这是什么原因呢?
注意,Python仅仅对比较小的整数对象进行缓存(范围为范围[-5,256])缓存起来,而并非是所有整数对象。需要注意的是,这仅仅是在命令行中执行,而在Pycharm或者保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化。
总结
1、is比较两个对象的id值是否相等,是否指向同一个内存地址;
2、==比较的是两个对象的内容是否相等,值是否相等;
3、小整数对象[-5,256]在全局解释器范围内被放入缓存供重复使用;
4、is运算符比==效率高,在变量和None进行比较时,应该使用is。
以上内容为大家介绍了Python中的比较:is与==,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。

猜你喜欢LIKE
相关推荐HOT
更多>>
python函数中使用for循环
python函数中使用for循环1、在for循环中使用函数需要更长的执行时间,因为每次迭代都会调用该函数。2、如果for循环是在函数内部实现的,那么该...详情>>
2023-11-14 13:53:34
python3.1版本的特性有哪些
python3.1中的特性有哪些1、千位数格式化,可以在使用字符串格式化函数时直接完成。在格式化大数时,通常是每三位数放置逗号,使数字更易读(例...详情>>
2023-11-14 13:18:27
python__new__()和__init__()有什么区别?
在python中,__new__()不是一定要有,只有继承自object的类才有,该方法可以return父类(通过super(当前类名,cls).__new__())出来的实例,或者直...详情>>
2023-11-14 12:38:55
pythonwheel是什么
python的第一个主流打包格式是.egg文件,现在大家庭中又有了一个叫做Wheel(*.whl)的新成员。wheel“被设计成包含PEP376兼容安装(一种非常接近于...详情>>
2023-11-14 11:30:39热门推荐
pythonSymPy求极值
沸python归并排序和快速排序比较
热pythonpartition如何分割字符串
热pythonif-elif-else语句的使用注意
新python函数中使用for循环
python3.1版本的特性有哪些
python__new__()和__init__()有什么区别?
python作为小白该如何抉择python编辑器?
pythonwheel是什么
python如何定义一个函数
pythonpython是什么类型的语言
python怎么传参数
pythonshell是什么
python如何查看对象属性
技术干货






