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

点击上方“程序人生”,选择“置顶公众号”

第一时间关注程序猿(媛)身边的故事


640?wx_fmt=gif

作者

sergiojune

如需转载,请联系原作者授权。


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


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


 
 

a = 1


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


 
 

a = [12]
b = a
b.append(3)
print(a)
# 结果
[123]


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


 
 

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


可以看到,是相等的。


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


 
 

a = [123]
b = [123]
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))
# 结果
True
1956929696 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。


完毕!


- The End -

「若你有原创文章想与大家分享,欢迎投稿。」

加编辑微信ID,备注#投稿#:

程序 丨 druidlost  

小七 丨 duoshangshuang

上期精彩内容

640?wx_fmt=png

640?wx_fmt=gif

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值