第7行,适用第三条规则,python解释器首先看到标识符g,按照LEGB的顺序往上找,先找L层(也就是在inFunc内部),没有。再找E层,有,值为10。因此这里的g的值为10。寻找过程到为止,并不会再往上找到'G'层。寻找e的过程也一样,e的值为2。因此第9行的结果为12。
其实,所谓的“LEGB”是为了学术上便于表述而创造的。让一个编程的人说出哪个标识符处于哪个层没有什么意义,只要知道对于一个标识符,python是怎么寻找它的值的就可以了。其实找值的过程直观上也很容易理解。
通过上面的例子也可以看出,如果在不同的命名空间中定义了相同的标识符是没有关系的,并不会产生冲突。寻找一个标识符的值过程总是从当前层开始往上找的,首先找到的就为这个标识符的值。也由此可以这么说,'B'层标识符在所有模块(.py文件)中可用;'G'层标识符在当前模块内(.py文件)中可用;'E'和'L'层标识符在当前函数内可用。
再来看一个例子,来解释global语句的用法。代码如下所示:
>>> g = 'global'
>>> s = 'in'
>>> def out():
g = 'out'
def inter():
global g
print s,g
inter()
>>> out() ===> 'in global'
可以看到,虽然有两个层中的g,但使用了global语句后,就是指'G'层的标识符。也就是第7行中的g,就是指第1行产生的那个g,值为'global'。
最后说一句,其实只要在编程的时候注意一下,不要使用相同的标识符,基本上就可以避免任何与命名空间相关的问题。还有就是在一个函数中尽量不要使用上层命名空间中的标识符,如果一定要用,也最好使用参数传递的方式进行,这样有利于保持函数的独立性。










