1. 程式人生 > 實用技巧 >Python 中 3 個不可思議的返回

Python 中 3 個不可思議的返回

第一個:神奇的字典鍵

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" 覆蓋了.

  • 這個 StackOverflow的回答(https://stackoverflow.com/a/32211042/4354153)漂亮的解釋了這背後的基本原理.

第二個:異常處理中的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將始終是最後執行的語句.

廣州vi設計http://www.maiqicn.com 我的007辦公資源網站https://www.wode007.com

第三個:相同物件的判斷

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()
I
I
D
D
False
>>> id(WTF()) == id(WTF())
I
D
I
D
True

正如你所看到的, 物件銷燬的順序是造成所有不同之處的原因