优秀的编程知识分享平台

网站首页 > 技术文章 正文

python中 == 和 is 可以相互替代吗?

nanyue 2025-03-29 20:16:42 技术文章 6 ℃

当我们判断两个对象是否相同,我们经常是这样做

#对于数值,我们可以这样
n = 10
m = 10
print(n==m)  #输出True
print(n is m)   #输出True
a='abc'
b='bcd'
print(a == b)  #输出True     #对于字符串同样没问题
print(a is b)  #输出True

但是如果我们判断两个序列是否相等

a=[1,2,3]
b=[1,2,3]
print(a == b)  #输出True
print(a is b)     #输出False

明明是相同的列表,但是 使用is 和 == 却是不同的结果

is 和 == 的相同和不同

两者都可以判断对象是否相等,但是又有所不同

== 用于比较两个对象的值是否相等。它关注的是对象的“value”是否一致,而不关心它们在内存中的地址是否相同。例如,比较两个数字或字符串时,只要它们的值相同,运算符就会返回True

is 属于逻辑判断,用于检查两个对象的身份是否相同,即它们是否引用内存中的同一个对象。它比较的是对象的“身份”或“地址”。如果两个对象在内存中的地址相同,is运算符就会返回True。

关键就是在内存地址,我们可以看一下两个列表的内存地址,可以通过id函数来查看

a=[1,2]
b=[1,2]
id(a)
2133939149312
id(b)
2133854189568

我们可以看到,分别创建两个相同的列表,但是他们储存在内存中的地址是不同的

但是我们创建两个相同的数据,他们的内存地址是相同的

a=5
b=5
id(a) >> 140717472727976
id(b) >> 140717472727976

is 和 ==的使用场景

值相等性判断:在大多数情况下,我们关心的是对象的值是否相等。例如,比较两个字符串或数字时,通常使用`==`。例如,num1 num2会检查它们的值是否相同,而不会关心它们是否存储在内存中的相同位置。

判断是否是同一个对象:在某些特殊场景下,如检查两个变量是否引用同一个对象时,需要使用is。例如,a is b会检查a和b是否引用内存中的同一个对象。

python中的内存管理机制

  1. 对于较小的整数(如-5到256之间的整数)和字符串,python会为这些对象预先分配内存,并将其存储在内部的缓存中,这是一种对象重用策略,python会重用以及存在的对象而不是创建新的对象,这样做一般是为了提高读取性能和节约内存。
  2. 较大的数值或者长字符串每次创建时都会在内存中分配新的地址。
  3. 但是对于元组、字典、列表、集合以及range、map等容器类对象,他们的值看起来一样,但内存却不相同,每次创建是都会在内存中分配新的地址。
  4. 实数:对于实数(有理数和无理数),由于精度存储问题,即使值相同,其内存地址也可能不同

Tags:

最近发表
标签列表