返回顶部

python 中 is和==的区别

一.is和==区别

  • id() 我们可以使用id()查到一个变量表示的值在内存中的地址
print(id(s))  # 3212877232496
s = 'haha'
print(id(s))  # 3212877232496

lst = [1, 2, 4]
print(id(lst))  # 4326685768
lst1 = [1, 2, 4]
print(id(lst1))  # 4326684360
# 我们发现. 字符串的数据地址是⼀样的. ⽽ 列表的数据地址是不⼀样的.
  • ⼩数据池(常量池): 把我们使⽤过的值存储在⼩数据池中.供其他的变量使⽤. ⼩数据池给数字和字符串使⽤, 其他数据类型不存在. 对于数字: -5~256是会被加到⼩数据池中的. 每次使⽤都是同⼀个对象
  • 对于字符串:
    • 如果是纯⽂字信息和下划线. 那么这个对象会被添加到⼩数据池
    • 如果是带有特殊字符的. 那么不会被添加到⼩数据池. 每次都是新的
    • 如果是单⼀字⺟*n的情况. 'a'*20, 在20个单位内是可以的. 超过20个单位就不会添加 到⼩数据池中
  • 注意(⼀般情况下): 在py⽂件中. 如果你只是单纯的定义⼀个字符串. 那么⼀般情况下都是会 被添加到⼩数据池中的. 我们可以这样认为: 在使⽤字符串的时候, python会帮我们把字符串 进⾏缓存, 在下次使⽤的时候直接指向这个字符串即可. 可以节省很多内存.
  1. is比较的就是id()计算出来的结果. 由于id是帮我 们查看某数据(对象) 的内存地址. 那么is比较的就是数据(对象)的内存地址. 最终我们通过is可以查看两个变量使⽤的是否是同⼀个对象.
  2. == 双等表⽰的是判断是否相等, 注意. 这个双等比较的是具体的值.⽽不是内存地址

s1 = "哈哈"
s2 = "哈哈"
print(s1 == s2)  # True
print(s1 is s2)  # True 原因是有⼩数据池的存在 导致两个变量指向的是同⼀个对象
l1 = [1, 2, 3]
l2 = [1, 2, 3]
print(l1 == l2)  # True, 值是⼀样的
print(l1 is l2)  # False, 值是假的

  总结:

is 比较的是地址

== 比较的是值

posted @ 2021-07-11 17:15  fuju  阅读(199)  评论(0)    收藏  举报