Python這五個坑,80%你不知道(對的,五個你知道1個就達到通常水平了)

1 含單個元素的元組

Python中有些函數的參數類型爲元組,其內有1個元素,這樣建立是錯誤的:python

c = (5) # NO!

它實際建立一個整型元素5,必需要在元素後加一個逗號:app

函數

c = (5,) # YES!

2 默認參數設爲空

含有默認參數的函數,若是類型爲容器,且設置爲空:spa

def f(a,b=[]):  # NO!
print(b)
return b

ret = f(1)
ret.append(1)
ret.append(2)
# 當再調用f(1)時,預計打印爲 []
f(1)
# 可是卻爲 [1,2]

這是可變類型的默認參數之坑,請務必設置此類默認參數爲None:code

def f(a,b=None): # YES!
pass

3 共享變量未綁定之坑

有時想要多個函數共享一個全局變量,但卻在某個函數內試圖修改它爲局部變量:對象

i = 1
def f():
i+=1 #NO!

def g():
print(i)

應該在f函數內顯示聲明i爲global變量:blog

i = 1
def f():
global i # YES!
i+=1

4 列表快速複製之坑

在python中*與列表操做,實現快速元素複製:ip

a = [1,3,5] * 3 # [1,3,5,1,3,5,1,3,5]
a[0] = 10 # [10, 2, 3, 1, 2, 3, 1, 2, 3]

若是列表元素爲列表或字典等複合類型:rem

a = [[1,3,5],[2,4]] * 3 # [[1, 3, 5], [2, 4], [1, 3, 5], [2, 4], [1, 3, 5], [2, 4]]

a[0][0] = 10 #

結果可能出乎你的意料,其餘a[1[0]等也被修改成10it

[[10, 3, 5], [2, 4], [10, 3, 5], [2, 4], [10, 3, 5], [2, 4]]

這是由於*複製的複合對象都是淺引用,也就是說id(a[0])與id(a[2])門牌號是相等的。若是想要實現深複製效果,這麼作:

a = [[] for _ in range(3)]

5 列表刪除之坑

刪除一個列表中的元素,此元素可能在列表中重複屢次:

def del_item(lst,e):
return [lst.remove(i) for i in e if i==e] # NO!

考慮刪除這個序列[1,3,3,3,5]中的元素3,結果發現只刪除其中兩個:

del_item([1,3,3,3,5],3) # 結果:[1,3,5]

正確作法:

def del_item(lst,e):
d = dict(zip(range(len(lst)),lst)) # YES! 構造字典
return [v for k,v in d.items() if v!=e]

以上就是5個常見的坑點,但願看到這裏的朋友能避開這些坑。

相關文章
相關標籤/搜索