疯狂的Python-04(鸠占鹊巢)
2018-09-03 本文已影响5人
景行1023
一些有趣的鲜为人知的Python特性集合
无论你是Python新手还是Python老手,我相信,这个系列的文章都会让你获益良多!
阅读此系列任何文章前请务必观看:疯狂的Python-目录大纲
▶ 鸠占鹊巢 *
class Crazy:
pass
Output:
>>> Crazy() == Crazy() # 两个类实例是不同的
False
>>> Crazy() is Crazy() # 它们的id号也是不一样的
False
>>> hash(Crazy()) == hash(Crazy()) # 它们的哈希值按说也应该不一样
True
>>> id(Crazy()) == id(Crazy())
True
💡 解释:
-
当
id
函数被调用的时候,Python创建了一个Crazy
类实例,然后把这个实例传给了id
函数。然后id
函数返回这个实例的"id"号(实际上就是这个实例在内存中的地址),接着这个实例就被丢弃并且销毁了。 -
当我们紧接着再做一遍上面的步骤的时候,Python会把同一块内存空间分配给第二次创建的
Crazy
实例。又因为在CPython中id
函数使用的是内存地址作为返回值,所以就会出现两个对象实例的id号相同的情况了。 -
所以,"对象的id是唯一的"这句话有一个前提条件是"在这个对象的生命周期内"。当这个对象在内存被销毁以后,其他的对象就可以占用它之前所用的内存空间产生一样的id号。
-
但是为什么上面的例子里
is
操作符却产生了False
? 我们再看一个例子。class Crazy(object): def __init__(self): print("I") def __del__(self): print("D")
Output:
>>> Crazy() is Crazy() I I D D False >>> id(Crazy()) == id(Crazy()) I D I D True
现在你可以发现, 不同的使用实例的方法会对实例销毁的时间产生影响。