成都网站建设设计

将想法与焦点和您一起共享

python语言中的==和is有什么不同

本篇内容主要讲解“python语言中的 == 和 is 有什么不同”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python语言中的 == 和 is 有什么不同”吧!

成都创新互联是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的10余年时间我们累计服务了上千家以及全国政企客户,如木托盘等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致称誉。

对于这两个运算符的理解,可以在很大程度上体现一个人对python的精通程度,说道他们的不同,可以总结为以下两点

  1. == 是比较关系运算符,is 是身份运算符

  2. == 比较两个对象的值是否相等,is 比较的是两个对象的内存地址是否相同

在实际应用中,对这两个运算符的使用,往往让人感到困惑不解

a = [1]
b = [1]

print(a == b)
print(a is b)

程序输出的结果

True
False

对于a == b 这个表达式的结果,应该没有什么异议,分歧和不解出现在第二个表达式a is b, is 身份运算符比较的是两个对象的内存地址,显然,变量a 与b所指向的列表的内存地址是不同的。

python语言中的 == 和 is 有什么不同

在你使用赋值语句时,解释器会在内存中创建一个列表[1], 这个创建过程发生了两次,他们的内存地址不同,正因a 和b是两个不同的列表,他们才能分别存储数据而不会互相影响,所以,理解这个问题的关键在于,当a = [1] 这行代码被执行时,在内存中创建了一个新的列表[1]。

内存池

好奇心强的人,可能会立即写代码实验,来验证前面所讲

a = [1]
b = [1]

print(id(a), id(b))

程序输出结果

4714131208 4714127880

内置函数id()可以返回对象的内存地址,他们果然不相同,但是,事情总有蹊跷,下面的代码就无法用前面所讲的理论来解释

a = 1
b = 1

print(a == b)
print(a is b)

程序输出结果

True
True

按照前面所讲,两次执行赋值语句,应该在内存中创建出两个1啊,他们的内存地址应该不同,a is b 的结果应该是False,但实际运行代码得到的却是True,这是为何?

不同于列表,int类型数据是不可变数据,两个变量同时指向一个int类型数据不会产生意外的后果,因此python使用了内存池技术,python的设计者认为-5到256这个范围内的整数是经常被使用的,不应该频繁的创建和销毁,因此建立了一个内存池,-5到256之间的数只会存在一个,任何时候使用他们,所用的都是内存池中的那一个,不会重新创建,因此他们的内存地址相同。

交互式解释器

如果你仍然保持强烈的好奇心,那么你可能会继续试验,来验证前面的理论

a = 257
b = 257

print(a == b)
print(a is b)

程序输出结果

True
True

又一次感到困惑,不是说好了-5到256在内存池中,现在用的是257,为啥a is b的结果也是True?

这段代码,想要得到理论的结果,必须在python交互式解释器中执行,如果你是在pycharm中执行,或者通过python命令执行脚本的方式执行,所得结果都为True,原因在于通过这些方式运行时,在编译阶段会做优化,因为实在没必要创建出两个257。

如果在python交互式解释器中运行这段代码,就可以见证理论的正确性

>>> a = 257
>>> b = 257
>>> a == b
True
>>> a is b
False

到此,相信大家对“python语言中的 == 和 is 有什么不同”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


分享文章:python语言中的==和is有什么不同
链接地址:http://chengdu.cdxwcx.cn/article/jcicpe.html