Python中的is和==区别

mac2025-10-05  2

预先知识
Python的字典和集合底层都是哈希表实现的,哈希表存在两个问题: 1. 哈希冲突的解决方法和根据装载因子扩容问题在Java中HashMap的实现方式是扩容容量增加为原来两倍,解决冲突的方法是链地址法, 当某个箱子的链表长度>8,转化为红黑树, <6,从红黑树转换为链表,以便提高插入删除查询的性能如果两个对象相同,hashcode一定相同。但是hashcode相同的两个对象不一定相同Java中的HashMap重写了hashcode()和equals()方法,如果两个对象产生的哈希码不同,那么一定不同。如果相同,那么这两个对象有可能相同,再用equals()方法进行比较 5.Python中不可变对象是可以哈希的(hashable),你可以用hash()函数.

eg:

In [172]: l = True In [173]: b = True In [174]: l == b Out[174]: True In [175]: l is b Out[175]: True In [176]: l = 10 In [177]: b = 10 In [178]: l == b Out[178]: True In [179]: l is b Out[179]: True In [180]: id(l) == id(b) Out[180]: True In [181]: l = 10000 In [182]: b = 10000 In [183]: l == b Out[183]: True In [184]: l is b Out[184]: False In [202]: id(l) == id(b) Out[202]: False In [203]: hash(l) == hash(b) Out[203]: True In [204]: l = 'a'*1000 In [205]: b = 'a'*1000 In [206]: l is b Out[206]: False In [207]: id(l) == id(b) Out[207]: False In [208]: hash(l) == hash(b) Out[208]: True
结论

python为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁空间。而python对小整数的定义是[-5,257). 字符串对象也有一个类似的缓冲池 只有在通用对象池中的况下,整数型和字符串型a is b 才为True. 否则a和b是int、str、tuple、list、dict或set类型时,a is b 均为False.

最新回复(0)