當前位置:
首頁 > 最新 > 聽說這些「坑」百分之九十的Python開發者都掉進來過!那你呢?

聽說這些「坑」百分之九十的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。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

1.5 讓VS Code擁有Python的Shell——「系統終端+IPython」
Python需要了解清楚的問題

TAG:Python |