App下載
3. 我們都一樣
一本正經(jīng)的Python課程 / 3. 我們都一樣
手機也能上課
App下載
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

正如你所看到的, 對象銷毀的順序是造成所有不同之處的原因。


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