本文主要是介绍深入理解 Python 中的 is 和 ==,比较操作符的细微差别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在 Python 中,is
和 ==
是两种不同的比较操作符,用于比较对象之间的关系。
概念
-
is
操作符:is
用于检查两个对象是否是同一个对象,即它们是否具有相同的内存地址。如果两个对象是同一个对象,则返回True
,否则返回False
。a = [1, 2, 3] b = [1, 2, 3] c = aprint(a is b) # False,a 和 b 是不同的对象 print(a is c) # True,a 和 c 是同一个对象
-
==
操作符:==
用于检查两个对象的值是否相等,即它们是否具有相同的内容。如果两个对象的值相等,则返回True
,否则返回False
。a = [1, 2, 3] b = [1, 2, 3]print(a == b) # True,a 和 b 具有相同的值
因此,is
操作符用于比较对象的身份(即内存地址),而 ==
操作符用于比较对象的值。在大多数情况下,你应该使用 ==
操作符来比较对象的值,而不是 is
操作符,除非你明确地需要检查对象的身份。
小整数池
Python 为了优化速度,把这些可能频繁使用的整数对象规定在范围 [-5, 256] 之间的小对象放在 small_ints 中,但凡是需要用些小整数时,就从这里面取,不再去临时创建新的对象。
因此下面输出为True
a = 1
b = 1
print(a is b, id(a), id(b))a = 257
b = 257
print(a is b, id(a), id(b))
输出如下:
大整数缓存
尽管大于 256 的整数不会提前创建好,但如果 Python 解释器发现你用到重复的整数常量,也会将后面的变量指向已经创建好的对象。
- 脚本执行
新建demo.py,代码如下
a = 1000;b = 1000
print(a is b)c = 1000
d = 1000
print(c is d)
执行python demo.py
,输出如下:
- pycharm中执行
a = 1000; b = 1000
print(a is b) # Truec = 1000
d = 1000
print(c is d) # True
- 交互式python中
可以看到在不同环境下结果也不相同,并且,同在交互式环境下,写在同一行也是跟分开写也是不同的。
这是因为 Python 的缓存机制,所以在IDE 环境
或脚本模式
或交互式模式写在同一行
时,同一个整数被多个变量引用均不会开辟新的内存空间。
字符串驻留优化
针对以下代码测试
a = "hello"
b = "hello"
print(a is b)c = "hello world"
d = "hello world"
print(c is d)c = "hello world";d = "hello world"
print(c is d)
-
脚本模式
-
pycharm执行
- 交互式模式
字符串驻留机制是Python针对字符串对象采取的一种内存优化技术。其目标是减少内存使用并提高程序的性能。
在Python中,字符串是不可变的对象,一旦创建,就不能被修改。因此,如果我们创建了两个字符串,它们将占用两个不同的内存位置。但是,如果这些字符串是相同的,那么它们将被Python自动合并为一个对象,这就是字符串驻留机制。
Python中的字符串驻留机制是通过使用intern机制来实现的。当我们创建一个字符串时,Python会检查字符串池中是否已经存在相同的字符串。如果是,它将返回现有的字符串对象的引用,而不是创建一个新的对象。这样,我们可以在不占用额外内存的情况下使用相同的字符串。
其它
通过测试发现,不可变对象均符合上面的规则,在不同环境下执行跟字符串表现一致:
a = (1, 2)
b = (1, 2)
print(a is b)
a = (1, 2);b = (1, 2)
print(a is b)a = 1.2
b = 1.2
print(a is b)
a = 1.2;b = 1.2
print(a is b)
注意
以上代码均在python3.9下测试
这篇关于深入理解 Python 中的 is 和 ==,比较操作符的细微差别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!