3. 我們都一樣
一本正經(jīng)的Python課程 / 3. 我們都一樣
手機(jī)也能上課
App下載
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ì)象銷毀的順序是造成所有不同之處的原因。


+10 經(jīng)驗(yàn) +10積分
解析
提示
參考答案
+10 經(jīng)驗(yàn) +10積分
視頻播放結(jié)束,是否學(xué)習(xí)下一節(jié)?