訪問一個屬性時,解釋器必須在三個名稱空間中的一個找到他。
首先從局部名稱空間開始,如果沒有找到,解釋器將繼續查找全局名稱空間。
如果這也失敗了,它將在內建空間名稱裏查找。如果最後的嘗試也失敗了,將會報NameError。
局部空間名稱中找到的名字會隱藏全局或內建名稱空間的對應對象。這就相當於覆蓋了那個全局變量
def foo(): bar = 299 print("in foo,bar is",bar) bar = 101 print("in main,bar is",bar) foo()
in main,bar is 101
in foo,bar is 299
foo()函數局部名稱空間裏的bar變量覆蓋了全局的bar變量。
雖然bar純在域全局名稱空間裏,但程序首先找到的是局部名稱空間裏的那個,所以覆蓋了全局的哪一個。