神奇的字典鍵
some_dict = {}
some_dict[5.5] = "python"
some_dict[5.0] = "C++"
some_dict[5] = "Golang"
輸出如下:
>>> some_dict[5.5]
"python"
>>> some_dict[5.0]
"Golang"
>>> some_dict[5]
"Golang"
for k,v in some_dict.items():
print(k,v)
輸出如下:
5.5 python
5.0 Golang
"Golang" 消除了 "C++" 的存在?
說明:
-
Python 字典通過檢查鍵值是否相等和比較哈希值來確定兩個鍵是否相同.
-
具有相同值的不可變對象(比如字符串,數字類型)在Python中始終具有相同的哈希值.
注意: 具有不同值的對象也可能具有相同的哈希值(哈希衝突).
>>> 5 == 5.0
True
>>> hash(5) == hash(5.0)
True
-
當執行
some_dict[5] = "Python"
語句時, 因爲Python將5
和5.0
識別爲some_dict
的同一個鍵, 所以已有值 "C++" 就被 "Python" 覆蓋了.
異常處理中的return
def some_func():
try:
print("try子句")
return 'from_try'
finally:
print("finall子句")
return 'from_finally'
輸出如下:
>>> some_func()
try子句
finall子句
from_finally
說明:
-
當在 "try…finally" 語句的
try
中執行return
,break
或continue
後,finally
子句依然會執行。 -
而函數的返回值是由最後執行的
return
語句決定。 -
由於
finally
子句一定會執行, 所以finally
子句中的return
將始終是最後執行的語句。
相同對象的判斷
class WTF:
pass
輸出如下:
>>> 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")
輸出如下:
>>> WTF() is WTF()
I
I
D
D
False
>>> id(WTF()) == id(WTF())
I
D
I
D
True
正如你所看到的,這是由於對象銷燬的順序所造成的不同。