分享3 个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的 回答(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 將始終是最后執行的語句.
第三個:相同對象的判斷
class?WTF:passOutput:
>>>?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 呢? 讓我們看看這段代碼.
Output:
>>>?WTF()?is?WTF() I I D D False >>>?id(WTF())?==?id(WTF()) I D I D True正如你所看到的, 對象銷毀的順序是造成所有不同之處的原因.
原文鏈接:https://github.com/leisurelicht/wtfpython-cn
以上就是今天的分享,如果你覺得文章還不錯,請大家?點贊、分享、留言?下,因為這將是我持續輸出更多優質文章的最強動力!
——END—— 最近發現一個點外賣每頓飯都能少花5-20元的寶藏號。 就是她,↓點擊下面名片關注公眾號↓ 進入公眾號點擊菜單領取紅包最低5元,最高56元!總結
以上是生活随笔為你收集整理的分享3 个Python冷知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pandas实用技能,数据筛选query
- 下一篇: Jupyter中那些神奇的第三方拓展魔术