閱讀284 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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
42
foo中的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

  上一篇:go 一種加快在蘋果app store中上架的方法
  下一篇:go 九度題目1339:ACM