Python 中 3 個難以想象的返回

第一個:神奇的字典鍵html

 

some_dict = {}
some_dict[5.5] = "Ruby"
some_dict[5.0] = "JavaScript"
some_dict[5] = "Python"

不少人學習python,不知道從何學起。python

不少人學習python,掌握了基本語法事後,不知道在哪裏尋找案例上手。app

不少已經作案例的人,殊不知道如何去學習更加高深的知識。函數

那麼針對這三類人,我給你們提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的源代碼!學習

QQ羣:1097524789url

Output:spa

 

>>> some_dict[5.5]
"Ruby"
>>> some_dict[5.0]
"Python"
>>> some_dict[5]
"Python"

 

"Python" 消除了 "JavaScript" 的存在?code

說明:視頻

  • Python 字典經過檢查鍵值是否相等和比較哈希值來肯定兩個鍵是否相同.htm

  • 具備相同值的不可變對象在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 中執行 returnbreak 或 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

正如你所看到的, 對象銷燬的順序是形成全部不一樣之處的緣由.

第一個:神奇的字典鍵

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 中執行 returnbreak 或 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

正如你所看到的, 對象銷燬的順序是形成全部不一樣之處的緣由.

相關文章
相關標籤/搜索