前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面经系列《is和==的区别、Python的小整数池、*和**区别》

面经系列《is和==的区别、Python的小整数池、*和**区别》

作者头像
清菡
发布2021-06-10 01:34:35
4510
发布2021-06-10 01:34:35
举报
文章被收录于专栏:清菡软件测试

目录

• 一、is和==的区别?•二、延伸问题•三、*和**区别?

一、is和==的区别?

== 是比较两个对象的内容是否相等,即两个对象的“值”是否相等,不管两者在内存中的引用地址是否一样。

代码语言:javascript
复制
#1.地址一样,值也一样,所以==成立。qinghan1 ="a"qinghan2="b"qinghan3="b"qinghan4=qinghan3print(qinghan1==qinghan2,qinghan2==qinghan3,qinghan3==qinghan4)#运行结果:False True True
代码语言:javascript
复制
#2.引用地址不一样,但是只要值一样,==成立。val1=2000val2=2001val3=val1+1print(id(val3)==id(val2),val3==val2)# 运行结果:False True
代码语言:javascript
复制
# 3. 对于类的实例比较class Qinghan(object):    def __init__(self,name,age):        self.name=name        self.age=age    def run(self):        print("can run")a1=Qinghan("清菡",18)a2=Qinghan("清菡",18)a3=a2print(id(a1)==id(a2),a1==a2)# 运行结果:False False# 注意这里a1和a2的值是不等的,虽然初始化创建对象格式一样。print(id(a2)==id(a3),a2==a3)# 运行结果:True True

is比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同。即is比较两个条件:1.内容相同。2.内存中地址相同。

代码语言:javascript
复制
# 1.is成立的前提是内容相同,内存中地址相同。a1="a"a2="b"a3="b"a4=a3print(a1 is a2,a2 is a3,a3 is a4)# 运行结果:False True Trueprint(id(a1),id(a2),id(a3),id(a4))# 运行结果:2576608959656 2576608957976 2576608957976 2576608957976

2.光值相同不行,内存地址也要相同,才会成立。

代码语言:javascript
复制
# 3.类实例的比较,也要内存地址一致。class Qinghan(object):    def __init__(self,name,age):        self.name=name        self.age=age    def run(self):        print("can run")a1=Qinghan("清菡",18)a2=Qinghan("清菡",18)a3=a2print(id(a1),id(a2),id(a3))# 运行结果是:2036271539984 2036271540152 2036271540152print(a1 is a2,a2 is a3)# 运行结果:False True

靠谱链接:

https://blog.csdn.net/qq_26442553/article/details/82195061

二、延伸问题

为什么会这样呢?

Python的小整数池

小整数池目的:节省内存,提高执行效率。

Python中的一切东西皆为对象,那么每次给变量赋值是不是都需要新建一个对象呢?

实际编程过程中,像1、3、5这样的整数的使用频率比整数10000、11000使用更为频繁,对于低频整数每次都创建空间可能对于程序的性能影响并不大,但是对于较小的整数,由于其使用频率非常高,所以每次申请赋值都需要为其分配一个新的空间,无疑会大大降低程序的效率。

对于这个问题,Python明智地将整数分成了小整数和大整数两种类型,对于两种不同类型的数据分别采取了不同的方案:

小整数:将这部分有限的整数缓存于内存中,可共享。

大整数:将其放入使用单链表维护的对象池中,非共享,及每次创建都需要为其分配一块新的内存,即使内存中已经存在相同的整数。

需要注意的是:Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是[-5,256]。

该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被垃圾回收机制回收。

另外创建变量的值如果相同的话,创建的时间间隔又比较短,那么他们的内存空间的值是相同的。

在Pycharm中运行Python程序时,Pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也都包含在内一便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,无需细究。

图片来自网络

链接:

https://www.cnblogs.com/ludundun/p/11263181.html

https://blog.csdn.net/wuzqChom/article/details/90171000

三、*和**区别?

单个* 号:1.表示乘号;2.表示倍数;3.(1)单个*表示接受任意多个参数并将其放在一个元组中;(2)函数在调用多个参数时,在列表、元组、集合、字典及其他可迭代对象作为实参,并在前面加 *

如 *(1,2,3)解释器将自动进行解包然后传递给多个单变量参数(参数个数要对应相等)。

两个*号:

用于接收类似于关键参数一样赋值的形式的多个实参放入字典中(即把该函数的参数转换为字典)。

链接:https://blog.csdn.net/weixin_29313239/article/details/113968215


注:文章中的链接是本人整理过来的,皆来自网络。链接中的文章版权皆归原作者所有。除标明“图片来自网络”的图片,其它图片皆为小编本人所画。计算机知识都一样,文章是小编整理的。如有雷同,纯属巧合。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 清菡软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
    • 一、is和==的区别?
      • == 是比较两个对象的内容是否相等,即两个对象的“值”是否相等,不管两者在内存中的引用地址是否一样。
      • is比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同。即is比较两个条件:1.内容相同。2.内存中地址相同。
      • 2.光值相同不行,内存地址也要相同,才会成立。
    • 二、延伸问题
      • Python的小整数池
    • 三、*和**区别?
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档