是不是刚学python没多久的童鞋们,就经常被 is 和 == 搞得晕头转向?明明看起来两个变量值都一样,用 is 判断却返回false?又或者有时候用 is 居然又能判断相等?别急,很多时候都会在这个坑里摔一跤。
先来说个最直接的结论吧:==
检查的是值是否相等,而 is
检查的是是不是同一个对象。哎,别着急别着急!我知道这句话你可能已经在官方文档里看过一百遍了,但还是似懂非懂。没关系,我们慢慢来讲。
举个生活中的例子,你和你兄弟碰巧买了同款手机,型号、颜色、内存全都一模一样。这时候:
==
相当于问:“这两部手机型号一样吗?”(答案是肯定的)is
相当于问:“这是同一部手机吗?”(答案是否定的)
看懂了吧?== 只关心值,is 则关心的是身份。
来看一个简单的测试例子!
a = [1, 2, 3] b = [1, 2, 3] print(a == b) print(a is b)
看看控制台输出的结果:
上面的例子很符合直觉对吧?a和b虽然是两个不同的列表,但内容完全一样,所以 ==
为true,而 is
为false。
但是!但是! 看一个这个测试的例子最容易懵b的地方了:
x = 256 y = 256 print(x is y) # 输出 true
什么鬼?!为什么256的时候 is
为true为什么跟上面的执行结果不一样,难道python针对我?
别急,这不是bug,而是python的一个优化机制在作怪:小整数缓存。python为了性能考虑,会把一些常用的整数(通常是-5到256)预先创建好对象存起来。当你使用这个范围内的数字时,python直接给你返回已经创建好的那个对象,所以这些数字的 is
判断就会是true。
小插曲: 那么有的童鞋们就问了这个说的通常范围是-5到256,那我为什么输入比如说6666,返回的也是true呢?
执行结果如下:
这是因为解释器的实现差异问题:小整数缓存是 cpython 特有的实现细节,并非 python 语言规范的要求。
字符串也有类似的情况,叫做字符串驻留:
s1 = "hello" s2 = "hello" print(s1 is s2) # 通常输出 true s3 = "hello world!" s4 = "hello world!" print(s3 is s4) # 可能输出 false
短字符串通常会被python缓存,但较长的字符串就有可能不会了。注意,我用了“通常”和“可能”,因为这种行为取决于具体的python实现版本,不是语言规范要求的!
特殊情况:none、true、false
这三个家伙在python中是单例对象,也就是说整个程序中只有一个none、一个true、一个false。所以对于它们,你应该总是使用 is
来比较:
if value is none: # 推荐 if value == none: # 不推荐 if condition is true: # 有时候可以,但通常直接 if condition 更好
什么时候用is,什么时候用==?
简单来说:
- 当你关心值是否相等时,用
==
- 当你关心身份是否相同时,用
is
99%的情况下,你都是在比较值,所以应该用 ==
。那什么时候用 is
呢?主要是:
- 判断是否为none、true、false时
- 确实需要检查两个变量是否指向同一个对象时(比如在操作可变对象时)
记住这几个要点:
==
比较值,is
比较对象身份(内存地址)- 不要用小整数缓存和字符串驻留的特性来写代码!这些是实现细节,可能变化
- 判断none、true、false时用
is
- 其他绝大多数情况都用
==
最后送大家一句话:如果你不确定该用哪个,那就用 ==
,这样至少不会因为python的内部优化机制而踩坑。
希望这篇文章能帮你理清 is
和 ==
的区别。没有蠢问题,只有还没理解的概念!
到此这篇关于python中 is 和 ==的区别使用小结的文章就介绍到这了,更多相关python is 和 ==的区别内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论