分享3 个Python冷知识
轉(zhuǎn)自/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當(dāng)執(zhí)行 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'???? 說明:
當(dāng)在 "try…finally" 語句的 try 中執(zhí)行 return, break 或 continue 后, finally 子句依然會執(zhí)行.
函數(shù)的返回值由最后執(zhí)行的 return 語句決定. 由于 finally 子句一定會執(zhí)行, 所以 finally 子句中的 return 將始終是最后執(zhí)行的語句.
第三個:相同對象的判斷
class?WTF:passOutput:
>>>?WTF()?==?WTF()?#?兩個不同的對象應(yīng)該不相等 False >>>?WTF()?is?WTF()?#?也不相同 False >>>?hash(WTF())?==?hash(WTF())?#?哈希值也應(yīng)該不同 True >>>?id(WTF())?==?id(WTF()) True???? 說明:
當(dāng)調(diào)用 id 函數(shù)時, Python 創(chuàng)建了一個 WTF 類的對象并傳給 id 函數(shù). 然后 id 函數(shù)獲取其id值 (也就是內(nèi)存地址), 然后丟棄該對象. 該對象就被銷毀了.
當(dāng)我們連續(xù)兩次進(jìn)行這個操作時, Python會將相同的內(nèi)存地址分配給第二個對象. 因為 (在CPython中) id 函數(shù)使用對象的內(nèi)存地址作為對象的id值, 所以兩個對象的id值是相同的.
綜上, 對象的id值僅僅在對象的生命周期內(nèi)唯一. 在對象被銷毀之后, 或被創(chuàng)建之前, 其他對象可以具有相同的id值.
那為什么 is 操作的結(jié)果為 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
以上就是今天的分享,如果你覺得文章還不錯,請大家?點(diǎn)贊、分享、留言?下,因為這將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強(qiáng)動力!
——END—— 最近發(fā)現(xiàn)一個點(diǎn)外賣每頓飯都能少花5-20元的寶藏號。 就是她,↓點(diǎn)擊下面名片關(guān)注公眾號↓ 進(jìn)入公眾號點(diǎn)擊菜單領(lǐng)取紅包最低5元,最高56元!總結(jié)
以上是生活随笔為你收集整理的分享3 个Python冷知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pandas实用技能,数据筛选query
- 下一篇: Python IDE 详细攻略,拿来吧你