聽說這些「坑」百分之九十的Python開發者都掉進來過!那你呢?
1.濫用表達式作為函數參數默認值
在上面這段代碼里,一旦重複調用foo()函數(沒有指定一個bar參數),那麼將一直返回"bar",因為沒有指定參數,那麼foo()每次被調用的時候,都會賦予[]。下面來看看,這樣做的結果:
解決方案:
2.錯誤地使用類變數
先看下面這個例子:
3.為異常指定不正確的參數
假設代碼中有如下代碼:
4.誤解Python規則範圍
Python的作用域解析是基於LEGB規則,分別是Local、Enclosing、Global、Built-in。實際上,這種解析方法也有一些玄機,看下面這個例子:
02468
解決方案:
在b.py中:
可以很好地工作,也許你會感到驚訝。畢竟,我們確實在這裡做了一個循環導入,難道不應該有點問題嗎?
僅僅存在一個循環導入並不是Python本身問題,如果一個模塊被導入,Python就不會試圖重新導入。根據這一點,每個模塊在試圖訪問函數或變數時,可能會在運行時遇到些問題。
當我們試圖導入b.py會發生什麼(先前沒有導入a.py):
出錯了,這裡的問題是,在導入b.py的過程中還要試圖導入a.py,這樣就要調用f(),並且試圖訪問b.x。但是b.x並未被定義。
可以這樣解決,僅僅修改b.py導入到a.py中的g()函數:
Python擁有非常豐富的模塊庫,並且支持「開箱即用」。因此,如果不刻意避免,很容易發生命名衝突事件。例如,在你的代碼中可能有一個email.py的模塊,由於名稱一致,它很有可能與Python自帶的標準庫模塊發生衝突。
在Python 2裡面可以很好地運行:
解決方案:
10.濫用__del__方法
比如這裡有一個叫mod.py的文件:
下面,你在another_mod.py文件里執行如下操作:
import modmybar = mod.Bar()
你會獲得一個AttributeError異常。
至於為什麼會出現該異常,點擊這裡查看詳情。當解釋器關閉時,該模塊的全局變數全部設置為None。因此,在上面這個例子里,當__del__被調用時,foo已經全部被設置為None。
※1.5 讓VS Code擁有Python的Shell——「系統終端+IPython」
※Python需要了解清楚的問題
TAG:Python |