python 的 scope

python 和其它語言有一個不太一致的地方偶而讓我有點困擾: 只有 module、class、function 才有建立新的 scope。換句話說, if、while、for 沒有建立新的 scope。第一次知道時覺得有點驚呀, 像下列的程式可以正常運作:

if True:
    a = 3
else:
    a = 5
print a   # output: 3

這例子較無傷大雅, 但今天遇到另一個不好的例子:

def hello():
    print 'Hello, %s' % name

if __name__ == '__main__':
    name = 'John'
    hello()  # output: Hello, John

換句話說, 原本語意上將 main block 裡的變數看成是 local, 但它實際上是 global, 會造成隱晦的 bug。像是這份 script 的 hello 可正常執行, 但別的 module import 它後再執行 hello(), 就會造成錯誤, 因為找不到 global 變數 name。只能盡量減少 main block 裡的程式, 降低它的影響了。

留言

這個網誌中的熱門文章

(C/C++ ) 如何在 Linux 上使用自行編譯的第三方函式庫

熟悉系統工具好處多多

virtualbox 使用 USB 裝置