python新手常犯錯誤
本文參考自伯樂在線:https://blog.jobbole.com/42706/
1.用可變值作為默認值
記住一點,在Python裏,函數的默認值在函數定義的時候實例化的,而不是在調用的時候。
比如下麵這個函數,numbers參數初始化為空列表,那麼每次調用的時候都會將9加入到列表後麵:
def foo(numbers=[]): numbers.append(9) print numbers結果:
>>> foo() # first time, like before
[9]
>>> foo() # second time
[9, 9]
>>> foo() # third time...
[9, 9, 9]
>>> foo() # WHAT IS THIS BLACK MAGIC?!
[9, 9, 9, 9]
再看一個更加明顯的例子:
def print_now(now=time.time()): print now這個函數輸出當前時間戳,這個時間戳不是每次調用時的時間戳,而是該函數定義時被解釋器解釋時候的時間戳!
>>> print_now() 1373121487.91 >>> print_now() 1373121487.91 >>> print_now() 1373121487.91
2作用域
盡量不要用全局變量。這可能會帶來諸多麻煩。
bar = 42 def foo(): print bar上麵這段代碼的輸出結果是42,因為函數內部的bar是全局變量。再看下麵這段代碼:
>>> bar = 42 ... def foo(): ... bar = 0 ... foo() ... print bar 42foo中的bar其實是一個局部變量,你並沒有改變全局變量的值。再看下麵這段代碼:
bar = 42 def foo(): print bar bar = 0
你本來想打印全局變量bar之後再創建一個局部變量bar,但事實上,報錯了!

提示局部變量bar在沒有賦值前就被引用了。這是因為python是解釋性語言,當解釋器執行到def foo():函數聲明時,會靜態的從這個函數作用域獲取信息。當解釋到bar=0這一行時會把bar加入局部變量列表(是解釋到這一行,不是執行到這一行,所以此時局部變量bar並沒有被賦值),但當執行到print bar時,局部變量bar沒有賦值,所以就報錯了。
如果想讓程序按照原先的想法執行,那麼應該要加上global關鍵字聲明。
事實上,這些錯誤我們有時候很清楚,但就是寫的時候容易忽略這一點。尤其是在和其他語言混合編程的時候很容易混淆。
最後更新:2017-04-03 12:56:23