四时宝库

程序员的知识宝库

为什么python的is和==让无数人抓狂?3分钟彻底搞懂

杂谈

在学习python的过程中,我们遇到了两个兄弟,它们长得不像,但用法很像:

a = 1
b = 1

# True
print(a == b)
# True
print(a is b)

它们皆用于判断是否相等,这就让很多小伙伴犯了难,这俩货有啥区别呢?

一、区别

说到区别,我们可以先看看本公众号文章 《python参数传递的终极真相:不是传值,也不是传引用!》,这里面写了关于参数的区别,额外解释了 不可变和可变数据 如何指向内存空间的。

而要理解 is和== 的区别,也和数据的内存空间挂钩。简单理解,它俩的区别就是:

  • is:判断两个对象是不是同一个地址
  • ==:判断两个值是否相等

结果相同的情况

回到 杂谈 中的代码,我们可以看到 a和b都是等于1,而且因为python中的 1 是不可变数据,因此 a和b指向的地址 也是同一个。

可以看到图中的情况,我们可以看到不管是 is还是== 都应该相等,因此是 True

那么什么时候两个判断会不一样呢?在 《python参数传递的终极真相:不是传值,也不是传引用!》 中说过 可变数据 在创建时都会重新开辟地址,因此 is和==结果将会不同

结果不同的情况

a = [1, 2, 3]
b = [1, 2, 3]

# True
print(a == b)
# False
print(a is b)

根据 代码和图例,我们可以看到 a和b 都是 [1, 2, 3],因此它们的值是相同的,因此 ==时为True

而它们又是 可变数据,当创建时,地址空间里会重新创建一块地方分别给 a和b,因此 is时为False

有趣的现象

虽然我们的列表在 is判断时a和b 的结果是 False,但列表内部的数据又是 不可变数据,这就有个奇怪的现象,它们的值在 is和==判断 时结果都将是 True

a = [1, 2, 3]
b = [1, 2, 3]

# True
print(a[1] == b[1])
# True
print(a[1] is b[1])

二、三种情况用 is

现在问题来了,虽然搞清楚了区别,但是真正用起来的时候可能还是会搞不拎清,怎么用呢?

其实非常简单,咱们记住 三个场景,遇到这 三个场景 咱们用 is 即可,其他场景就用 ==

  1. None
  2. True
  3. False

非常好记,就上面三个场景,遇到了就用 is

a = None
b = True
c = False
d = 4
e = 'hi'

if a is None:
    pass

if b is True:
    pass

if c is False:
    pass

if d == 4:
    pass

if e == 'hi':
    pass

可以看到上面的示例代码中,当变量是 None、True、False 时就用 is,其他变量判断时我都用了 ==

上面的三个场景是大部分 is 使用情况,当然还会有其他场景,但非常少见,因为为了方便记忆,记住这三个场景即可。

三、总结

今天卡卡带大家了解了 is和== 的区别,而且记住 三个场景 就很容易掌握何时用哪个去判断了。

如果你喜欢这篇文章,希望能够 点赞、关注、留言 三连,感谢!

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接