手機也能上課
1/2
我們都一樣
示例:
class MyClass:
pass
執(zhí)行和輸出:
>>> MyClass() == MyClass() # 兩個不同的對象應(yīng)該不相等 False >>> MyClass() is MyClass() # 也不相同 False >>> hash(MyClass()) == hash(MyClass()) # 哈希值也應(yīng)該不同 True >>> id(MyClass()) == id(MyClass()) True
說明:
- 當調(diào)用 id 函數(shù)時, Python 創(chuàng)建了一個 WTF 類的對象并傳給 id 函數(shù). 然后 id 函數(shù)獲取其id值 (也就是內(nèi)存地址), 然后丟棄該對象. 該對象就被銷毀了.
- 當我們連續(xù)兩次進行這個操作時, Python會將相同的內(nèi)存地址分配給第二個對象. 因為 (在CPython中) id 函數(shù)使用對象的內(nèi)存地址作為對象的id值, 所以兩個對象的id值是相同的.
綜上, 對象的id值僅僅在對象的生命周期內(nèi)唯一. 在對象被銷毀之后, 或被創(chuàng)建之前, 其他對象可以具有相同的id值.
那為什么 is 操作的結(jié)果為 False 呢?
讓我們看看這段代碼.
class MyClass(object):
def __init__(self): print("I") def __del__(self): print("D")
執(zhí)行:
>>> MyClass() is MyClass()
I I D D False >>> id(MyClass()) == id(MyClass())
I D I D True
正如你所看到的, 對象銷毀的順序是造成所有不同之處的原因。