2011年6月9日 星期四

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 裡的程式, 降低它的影響了。

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...