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

在说 is 和 == 的区别以前,咱们先理解下python的变量。python的变量和java的变量有很大的区别,由于一个是动态语言,另外一个是静态语言。java

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

a = 1

上面的代码过程是先在内存中生成了一个int的对象,而后咱们把这个便利贴 a 贴在了上面,今后a变量就指向了这个对象。咱们还能够看看下面这个。app

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

能够看到,是相等的。spa

如今咱们再看看is和==之间的区别。咱们仍是先看一个例子。code

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机制。 rem

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:若是以为文章不错的话,欢迎随手点赞转发支持

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

相关文章
相关标签/搜索