您好,登录后才能下订单哦!
本篇内容主要讲解“python语言中的 == 和 is 有什么不同”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python语言中的 == 和 is 有什么不同”吧!
对于这两个运算符的理解,可以在很大程度上体现一个人对python的精通程度,说道他们的不同,可以总结为以下两点
== 是比较关系运算符,is 是身份运算符
== 比较两个对象的值是否相等,is 比较的是两个对象的内存地址是否相同
在实际应用中,对这两个运算符的使用,往往让人感到困惑不解
a = [1]
b = [1]
print(a == b)
print(a is b)
程序输出的结果
True
False
对于a == b 这个表达式的结果,应该没有什么异议,分歧和不解出现在第二个表达式a is b, is 身份运算符比较的是两个对象的内存地址,显然,变量a 与b所指向的列表的内存地址是不同的。
在你使用赋值语句时,解释器会在内存中创建一个列表[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 有什么不同”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。