天天看點

python新手常犯錯誤1.用可變值作為預設值2作用域

本文參考自伯樂線上:http://blog.jobbole.com/42706/

記住一點,在python裡,函數的預設值在函數定義的時候執行個體化的,而不是在調用的時候。

比如下面這個函數,numbers參數初始化為空清單,那麼每次調用的時候都會将9加入到清單後面:

結果:

再看一個更加明顯的例子:

這個函數輸出目前時間戳,這個時間戳不是每次調用時的時間戳,而是該函數定義時被解釋器解釋時候的時間戳!

盡量不要用全局變量。這可能會帶來諸多麻煩。

上面這段代碼的輸出結果是42,因為函數内部的bar是全局變量。再看下面這段代碼:

foo中的bar其實是一個局部變量,你并沒有改變全局變量的值。再看下面這段代碼:

你本來想列印全局變量bar之後再建立一個局部變量bar,但事實上,報錯了!

python新手常犯錯誤1.用可變值作為預設值2作用域

提示局部變量bar在沒有指派前就被引用了。這是因為python是解釋性語言,當解釋器執行到def foo():函數聲明時,會靜态的從這個函數作用域擷取資訊。當解釋到bar=0這一行時會把bar加入局部變量清單(是解釋到這一行,不是執行到這一行,是以此時局部變量bar并沒有被指派),但當執行到print bar時,局部變量bar沒有指派,是以就報錯了。

如果想讓程式按照原先的想法執行,那麼應該要加上global關鍵字聲明。

事實上,這些錯誤我們有時候很清楚,但就是寫的時候容易忽略這一點。尤其是在和其他語言混合程式設計的時候很容易混淆。