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