资讯专栏INFORMATION COLUMN

举例子让你明白python中is和==的区别

HitenDev / 973人阅读

摘要:在说和的区别之前,我们先理解下的变量。的变量和的变量有很大的区别,因为一个是动态语言,另一个是静态语言。结果可以看到,是相等的。现在我们再看看和之间的区别。这是为了防止你不小心创建了多个相同对象而浪费大量内存甚至会发生挤爆内存的后果。

在说 is 和 == 的区别之前,我们先理解下python的变量。python的变量和java的变量有很大的区别,因为一个是动态语言,另一个是静态语言。

java的变量就像是个盒子,是把对象的地址装进这个盒子内,就会有大的或者小的盒子。而python的变量像个便利贴,把他贴在哪个地方都可以,不需要管数据类型,只要你喜欢就可以。说太多没有用,得用代码体会下。

 a = 1  

上面的代码过程是先在内存中生成了一个int的对象,然后我们把这个便利贴 a 贴在了上面,从此a变量就指向了这个对象。我们还可以看看下面这个。

a = [1, 2]
b = a
b.append(3)
print(a)
# 结果[1, 2, 3]


这里是把a贴在了一个列表上,然后又用b指向a,接着操作b但是却打印了出了b的结果。这是因为a和b都是便利贴,都贴在了同一个列表上,所以操作一个的话,另外一个也会变化。或者我们可以看看这两个变量指向的对象是否是同于一个对象。

print(a is b)
print(id(a), id(b))
# 结果True1461897824584 1461897824584


可以看到,是相等的。

现在我们再看看is和==之间的区别。我们还是先看一个例子。

a = [1, 2, 3]
b = [1, 2, 3]
print(a is b)
print(a == b)


大家可以先猜猜结果是什么。我之前说了python的变量就是个便利贴,[1, 2, 3]都是直接赋值给两个变量,也就是说生成了两个对象,所以a,b指向的对象不一样。所以结果出来了,第一个是False,第二个是True。为什么呢?因为is比较的是对象相同不相同,但是==比较的是值相同不相同。如果打印两个id值的话,显然是不同的。

print(id(a), id(b))
# 结果1735698385160 1735679028936


但是这个呢?

a = 1
b = 1
print(a is b)
print(id(a), id(b))
# 结果True1956929696 1956929696


为什么这个又相等了呢?这是因为python中有个intern机制。

intern机制就是不管你创建了多少个相同的字符串,在python中都是会指向同一个对象的。这是为了防止你不小心创建了多个相同对象而浪费大量内存甚至会发生挤爆内存的后果。有了这个理解,我们再看看下面例子就容易得出答案了。

a = "str"
b = "s" + "tr"
print(a is b) # 结果 True
c = "hello world"
d = "hello world"
print(c is d) # 结果 True

再来到==的实际调用,在用==进行判断的时候实际是调用魔法函数__eq__()来判断他们的值是否相等的。

总的来说,我们在判断是否是同一个对象的时候就用is,不要用==,所以在判断该对象是什么类型的时候建议用is或者直接用isinstance()这个方法。

class Person():
    pass
p = Person()
print(type(p) is Person)  # 结果 True


为什么上面结果是True呢?这是因为我们之前说过类本身也是个对象,用type()方法会指向该对象,又因为这个类,也就是对象是唯一的,所以结果就是True。

完毕!

ps:如果觉得文章不错的话,欢迎随手点赞转发支持

扫描二维码关注公众号获取更多资讯

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42124.html

相关文章

  • 面试官!让我们聊聊正则

    摘要:简述正则表达式是处理字符串的利器,并提高工作效率,一个好的正则能够帮我们省去几十甚至上百行代码。 简述 正则表达式是处理字符串的利器,并提高工作效率,一个好的正则能够帮我们省去几十甚至上百行代码。在工作中,也许你会见到在代码中出现很多正则处理字符串,也可能见到代码中毫无正则,原因在于会正则的人往往处理字符串首先想到用正则去处理,不会的那必然用很多API处理。并且在面试的时候很多同学往往...

    wendux 评论0 收藏0
  • Python 基础起步 (九) 条件语句 if elif else 其实很简单

    摘要:大家好,在我们上一篇复习了的基础和实用技巧后,今天我们来看一下里的逻辑关系,所谓逻辑关系无非就是如果就否则之类的,不是非常复杂,我的意思是复杂的地方不用目前了解,因为已经超出了小白的水准,哈哈,闲话少说,让我们一起来看看吧什么是里面用的形 大家好,在我们上一篇复习了dict的基础和实用技巧后,今天我们来看一下Python里的逻辑关系,所谓逻辑关系无非就是如果...就...否则...之类...

    nidaye 评论0 收藏0
  • Python多线程实现生产者消费者模式

    摘要:在生产者与消费者之间的缓冲区称之为仓库。生产者负责往仓库运输商品,而消费者负责从仓库里取出商品,这就构成了生产者消费者模式。中的多线程编程在实现生产者消费者模式之前,我们先学习下中的多线程编程。 什么是生产者消费者模式 在软件开发的过程中,经常碰到这样的场景:某些模块负责生产数据,这些数据由其他模块来负责处理(此处的模块可能是:函数、线程、进程等)。产生数据的模块称为生产者,而处理数据...

    lastSeries 评论0 收藏0

发表评论

0条评论

HitenDev

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<