Python的16個“坑”

發表於2016-06-21

1. 不要使用可變物件作為函式預設值

程式碼如下:

這2個例子說明了什麼? 字典,集合,列表等等物件是不適合作為函式預設值的. 因為這個預設值實在函式建立的時候就生成了, 每次呼叫都是用了這個物件的”快取”. 我在上段時間的分享python高階程式設計也說到了這個問題,這個是實際開發遇到的問題,好好檢查你學過的程式碼, 也許只是問題沒有暴露。

可以這樣改,程式碼如下:

2. 生成器不保留迭代過後的結果

程式碼如下:

3. lambda在閉包中會儲存區域性變數

程式碼如下:

這個問題還是上面說的python高階程式設計中說過具體原因. 其實就是當我賦值給my_list的時候,lambda表示式就執行了i會迴圈,直到 i =4,i會保留

但是可以用生成器,程式碼如下:

也可以堅持用list,程式碼如下:

有點不好懂是吧,在看看python的另外一個魔法,程式碼如下:

一個分組的函式,看起來很不好懂,對吧? 我們來解析下這裡

程式碼如下:

4. 在迴圈中修改列表項

程式碼如下:

思考一下,為什麼 – 是因為你對列表的remove,影響了它的index

程式碼如下:

5. IndexError – 列表取值超出了他的索引數

程式碼如下:

6. 重用全域性變數

程式碼如下:

7. 拷貝可變物件

程式碼如下:

8. python多繼承

程式碼如下:

看起來都是很簡單, 有次序的從底向上,從前向後找,找到就返回. 再看例子:

程式碼如下:

這也就涉及了MRO(Method Resolution Order):

程式碼如下:

MRO的演算法有點小複雜,既不是深度優先,也不是廣度優先

9. 列表的+和+=, append和extend

程式碼如下:

10. datetime也有布林值

這是一個坑,程式碼如下:

11. ‘==’ 和 is 的區別

我的理解是”is”是判斷2個物件的身份, ==是判斷2個物件的值,程式碼如下:

12. 淺拷貝和深拷貝

我們在實際開發中都可以向對某列表的物件做修改,但是可能不希望改動原來的列表. 淺拷貝只拷貝父物件,深拷貝還會拷貝物件的內部的子物件,程式碼如下:

13. bool其實是int的子類

程式碼如下:

14. 元組是不是真的不可變?

程式碼如下:

這裡有個不錯的解釋Python’s += Is Weird, Part II :

程式碼如下:

15. python沒有私有方法/變數? 但是可以有”偽”的

程式碼如下:

16. 異常處理加else

程式碼如下:

相關文章