(給Python開發者加星標,提升Python技能)
英文:Satwik Kansal,翻譯:暮晨
Python開發者整理自 GitHub
【導讀】:Python 是一個設計優美的解釋型高級語言,它提供了很多能讓程式設計師感到舒適的功能特性。但有的時候 Python 的一些輸出結果對於初學者來說似乎並不是那麼一目了然。
GitHub 有個倉庫收集 Python 中那些難以理解和鮮為人知的功能特性,並嘗試討論這些現象背後真正的原理!
雖然有些例子並不一定會讓你覺得「臥槽」(WTF),但它們依然有可能會告訴你一些你所不知道的 Python 有趣特性。我覺得這是一種學習程式語言內部原理的好辦法,而且我相信你也會從中獲得樂趣!
如果你是一位經驗比較豐富的 Python 程式設計師,你可以嘗試挑戰看是否能一次就找到例子的正確答案。你可能對其中的一些例子已經比較熟悉了,那這也許能喚起你當年踩這些坑時的甜蜜回憶。
示例程序基於Python3.5.2。
消失的外部變量e = 7
try:
raise Exception()
except Exception as e:
passOutput (Python 2.x):
>>> print(e)
# prints nothingOutput (Python 3.x):
>>> print(e)
NameError: name 'e' is not defined
說明:出處: https://docs.python.org/3/reference/compound_stmts.html#except
當使用 as 為目標分配異常的時候, 將在except子句的末尾清除該異常.
這就好像
except E as N:
foo會被翻譯成
except E as N:
try:
foo
finally:
del N這意味著異常必須在被賦值給其他變量才能在 except 子句之後引用它. 而異常之所以會被清除, 則是由於上面附加的回溯信息(trackback)會和棧幀(stack frame)形成循環引用, 使得該棧幀中的所有本地變量在下一次垃圾回收發生之前都處於活動狀態.(譯: 也就是說不會被回收)
子句在 Python 中並沒有獨立的作用域. 示例中的所有內容都處於同一作用域內, 所以變量 e 會由於執行了 except 子句而被刪除. 而對於有獨立的內部作用域的函數來說情況就不一樣了. 下面的例子說明了這一點:
def f(x):
del(x)
print(x)
x = 5
y = [5, 4, 3]Output:
>>>f(x)
UnboundLocalError: local variable 'x' referenced before assignment
>>>f(y)
UnboundLocalError: local variable 'x' referenced before assignment
>>> x
5
>>> y
[5, 4, 3]在 Python 2.x 中, Exception() 實例被賦值給了變量 e, 所以當你嘗試列印結果的時候, 它的輸出為空.(譯: 正常的Exception實例列印出來就是空)
Output (Python 2.x):
>>> e
Exception()
>>> print e
# 沒有列印任何內容!- EOF -
覺得本文對你有幫助?請分享給更多人
推薦關注「Python開發者」,提升Python技能
點讚和在看就是最大的支持❤️