访问一个属性时,解释器必须在三个名称空间中的一个找到他。
首先从局部名称空间开始,如果没有找到,解释器将继续查找全局名称空间。
如果这也失败了,它将在内建空间名称里查找。如果最后的尝试也失败了,将会报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纯在域全局名称空间里,但程序首先找到的是局部名称空间里的那个,所以覆盖了全局的哪一个。