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 裡的程式, 降低它的影響了。
沒有留言:
張貼留言