Python中三個不可思議的返回功能分享

第一個:神奇的字典鍵

some_dict = {}
some_dict[5.5] = "Ruby"
some_dict[5.0] = "JavaScript"
some_dict[5] = "Python"

Output:

>>> some_dict[5.5]
"Ruby"
>>> some_dict[5.0]
"Python"
>>> some_dict[5]
"Python"

"Python" 消除瞭 "JavaScript" 的存在?

💡 說明:

  • Python 字典通過檢查鍵值是否相等和比較哈希值來確定兩個鍵是否相同.
  • 具有相同值的不可變對象在Python中始終具有相同的哈希值.

註意: 具有不同值的對象也可能具有相同的哈希值(哈希沖突).

>>> 5 == 5.0
True
>>> hash(5) == hash(5.0)
True

當執行 some_dict[5] = "Python"語句時, 因為Python將5和5.0識別為some_dict的同一個鍵, 所以已有值 "JavaScript" 就被 "Python" 覆蓋瞭

第二個:異常處理中的return

def some_func:
try:
return 'from_try'
finally:
return 'from_finally'

Output:

>>> some_func
'from_finally'

💡 說明:

  • 當在 "try…finally" 語句的 try中執行return,break或continue後,finally子句依然會執行.
  • 函數的返回值由最後執行的 return語句決定. 由於finally子句一定會執行, 所以finally子句中的return將始終是最後執行的語句.

第三個:相同對象的判斷

class WTF:
pass

Output:

>>> WTF == WTF # 兩個不同的對象應該不相等
False
>>> WTF is WTF # 也不相同
False
>>> hash(WTF) == hash(WTF) # 哈希值也應該不同
True
>>> id(WTF) == id(WTF)
True

💡 說明:

當調用 id函數時, Python 創建瞭一個WTF類的對象並傳給id函數. 然後id函數獲取其id值 (也就是內存地址), 然後丟棄該對象. 該對象就被銷毀瞭.

當我們連續兩次進行這個操作時, Python會將相同的內存地址分配給第二個對象. 因為 (在CPython中) id函數使用對象的內存地址作為對象的id值, 所以兩個對象的id值是相同的.

綜上, 對象的id值僅僅在對象的生命周期內唯一. 在對象被銷毀之後, 或被創建之前, 其他對象可以具有相同的id值.

那為什麼 is操作的結果為False呢? 讓我們看看這段代碼.

class WTF(object):
def __init__(self): print("I")
def __del__(self): print("D")

Output:

>>> WTF is WTF
IIDDFalse>>> id(WTF) == id(WTF)
IDIDTrue

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

總結

到此這篇關於Python中三個不可思議的返回功能分享的文章就介紹到這瞭,更多相關Python返回功能內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: