python教程: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" 覆蓋了.這個 StackOverflow的 回答漂亮的解釋了這背后的基本原理.
第二個:異常處理中的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()
I
I
D
D
False
>>> id(WTF()) == id(WTF())
I
D
I
D
True
正如你所看到的, 對象銷毀的順序是造成所有不同之處的原因.
好啦!今天的分享到這里就結束了,希望大家持續關注馬哥教育官網,每天都會有大量優質內容與大家分享!版權聲明:轉載文章來自公開網絡,版權歸作者本人所有,推送文章除非無法確認,我們都會注明作者和來源。如果出處有誤或侵犯到原作者權益,請與我們聯系刪除或授權事宜。