python的is和==运算符

打印 上一主题 下一主题

主题 995|帖子 995|积分 2985

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在py中,有两个特别的运算符,is和==分别用来判定两个变量是不是相同的和两个变量的值是不是相同。
1. is运算符:用来比较两个对象的身份,即判定两个变量是否指向内存中的同一个对象
应用场景:1)单例模式:在需要确保整个程序中某个类只有一个实例的情况下,is运算符可以用来检查是否确实只有一个实例被创建。
2)检查None值:由于None在py中是单例的,因此使用is运算符来检查变量是否为None是最佳实践。
3)小整数和短字符串缓存:py为了进步效率,对肯定范围内的小整数和短字符串实现了缓存。这意味着,在这个范围内的整数和字符串在赋值给差别变量时,现实上是指向内存中的同一个对象。此时,使用is运算符可以判定这些变量是否指向相同的对象。
原理:py中的每个对象都有一个唯一的标识符(通常是一个整数),称为id. 当创建新对象时,py会主动分配一个唯一的id. is运算符通过比较两个对象的id值来判定它们是否相同。如果id值相同,则这两个对象在内存中现实上是同一个对象;如果id值差别,则它们是差别的对象,纵然它们的内容相同。
举例:
  1. a = 'hello'
  2. b = 'hello'
  3. print(a is b)
  4. print(id(a), id(b))
  5. 返回:
  6. True
  7. 2715382857968 2715382857968
复制代码
这里a is b返回True, 代表a,b两个变量是相等的,它们指向同一个内存地点,通过id()函数打印出它们的id, 也发现它们的id相同。
2. ==运算符用来比较两个对象的值(value)是否相同,而不是它们的身份。它会调用对象的__eq__方法(如果该方法被定义)来执行比较操作。
应用场景:1)比较根本数据类型:如整数、浮点数、字符串等,使用==比较它们的值是否相等。2)比较自定义对象:在自定义类中,可以重写__eq__方法来定义对象之间的等价性判定逻辑。
3)容器类型比较:如列表、元组,字典等,==运算符会比较这些容器的内容是否相等,而不是它们的身份。
原理:==运算符通过对象的__eq__方法(或等价地,对于某些类型,可能直接比较内部状态)来比较这两个对象的值,如果__eq__方法返回True,则认为这两个对象相等;否则,认为它们不相等。需要注意的是,并不是所有的对象都有__eq__方法,对于没有定义__eq__方法的对象,使用==运算符可能会导致TypeError.
举例:
  1. def is_equal_int():
  2.     n = 123
  3.     m = 123
  4.     print(n == m)
  5.     print(n is m)
  6.     print(id(n),id(m))
  7.    
  8. 输出:
  9. True
  10. True
  11. 3052616945712 3052616945712
复制代码
从上面这个例子,可以看出来整数n, m的比较,通过==运算符可以看出它们的值是相等的。
  1. def is_equal_list():
  2.     a = [1, 3, 4]
  3.     b = a
  4.     c = [1, 3, 4]
  5.     print(a == b)
  6.     print(a == c)
  7.     print(id(a),id(b),id(c))
  8.     print(a is b)
  9.     print(a is c)
  10. 输出:
  11. True
  12. True
  13. 2357738778304 2357738778304 2357738764416
  14. True
  15. False
复制代码
从上面这个例子可以看出,a==b结果是True,a==c结果也是True,由于它们比较的是值,而a is b返回True,由于a,b指向内存的同一个对象,而a is c返回False,虽然它们的值相同,但是它们的id差别,即它们的身份差别
  1. def is_none():
  2.     x = None
  3.     y = None
  4.     print(x==y)
  5.     print(x is y)
  6. 输出:
  7. True
  8. True
复制代码
由于None是单例,所有值为None的变量都指向内存的同一个对象。
3. is和==区别:1)性能差异:is比较通常比==比较更快,由于它只是比较两个对象的id值,这是一个简单的整数比较。==比较可能需要调用对象的__eq__方法,执行更复杂的逻辑,因此可能更慢。
注意事项:1)对于可变类型(如列表、字典等),纵然两个对象的内容相同,使用is也可能得到False,由于它们指向的是差别的内存地点。
2)对于不可变类型(如整数、字符串、元组等),在特定情况下(如小整数和短字符串缓存),使用is可能会得到True,纵然这些对象是通过差别的字面量创建的。然而,这种情况并不常见,且不应作为编写代码时的依赖。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表