十個Python陷阱(1 3)

2021-06-13 21:16:06 字數 1701 閱讀 4482

這些陷阱不一定是語言的缺陷,然而,這些語言的***,常常會使新手絆倒,甚至是有經驗的程式設計師也會中招。完全理解python的一些核心行為,反而可能會使你陷入其中。

這邊文章類似於乙個對python初學者的指導,早點了解這些陷阱,總比在實際專案的deadline前遭遇他們要好吧 :-)這不是在批評python語言,就像前面說的,大部分的陷阱並不是由於語言的缺陷。

好吧,先來個簡單的。但是,學習其他「空格無關」的語言的新手,就會因為他們的壞習慣被python懲罰。

先學習過某些靜態語言比如pascal和c的同學,經常會假設python變數和賦值的工作機制和它們一樣,乍一看上去,確實一樣:

a = b = 3

a = 4

print a, b # 4, 3

然而,在變長物件這裡卻會出問題,那是因為python對變長物件和定長變物件是不同的。
a = [1, 2, 3]

b = a

print b

# b is now [1, 2, 3, 4] as well

關於定長物件和變長物件在賦值時表現不同的說法事實上是不對的。當a = 3 b = a,這時a和b都引用了同乙個物件——乙個值為3的整數物件,但是,因為整數物件是不可變的,你並不會陷入到陷阱中。

解決方法:使用拷貝方法,切片操作符等,python從不隱式拷貝。read this.

諸如c之類的語言,+=是乙個簡化表示式的運算子,例如:

x += 42;

是下面的表示式的簡化:
x = x + 42;
所以,你可能認為在python中也是一樣的。當然,初看上去確實一樣:
a = 1

a = a + 42

# a is 43

a = 1

a += 42

# a is 43

然而,對於變長物件,x += y 跟 x = x + y不完全相同。考慮list:
>>> z = [1, 2, 3]

>>> id(z)

24213240

>>> z += [4]

>>> id(z)

24213240

>>> z = z + [5]

>>> id(z)

24226184

x += y 就地改變了list的值,而x = x + y建立了乙個新的list並重新將x繫結上去。乙個細微的差別可能導致難以追蹤的bug。

不僅僅是這些,當混合使用定長物件和變長物件的時候,你會有更加驚奇的發現:

>>> t = (,)

>>> t[0] += [2, 3]

traceback (most recent call last):

file "", line 1, in ?

typeerror: object doesn't support item assignment

>>> t

([2, 3],)

明顯的,元組不支援對其中元素的賦值——但是在對他使用+=後,元組裡的list確實改變了!原因依然是+=就地改變list的值。但是元組的賦值不被允許,當異發生時,元組中的list已經被就地改變了。

這就是乙個我個人覺得非常致命的陷阱。

解決方法:乾脆避免使用+=,或者僅僅在整數時使用它。:-)

原文:

十個美容陷阱

陷阱一不用晚霜,怕肌膚太油膩。天氣冷了,晚上真是不想再往臉上抹什麼霜了。再說了,不用晚霜,肌膚就不會那麼油膩,清爽的感覺真好!後遺症 冬天的肌膚是最容易因為乾燥而出現細小皺紋的時候哦!所以不管多冷,晚上都少不了要為肌膚補充適當的水分和營養。陷阱二為了省事,使用一種顏色的唇膏。好多美眉在冬天裡不太喜歡...

Python十個例項(四)

def josephus n,k n代表總人數,k代表報數的數字 list list range 1,n 1 index 0 while list temp list.pop 0 index 1 if index k index 0 continue if len list 2 print list...

python實現列表前十個元素公升序,後十個元素降序

輸入乙個整數列表,列表元素為20個,元素之間逗號隔開,編寫程式,將前10個元素公升序排列,後10個元素降序排列,並輸出列表。隨機生成列表 import random s for i in range 20 a s 0 10 a.sort b s 10 20 b.sort b.reverse prin...