初学python命名空间和LEGB原则

Python的命名空间是一个字典,字典内保存了变量名称与对象之间的映射关系,因此,查找变量名就是在命名空间字典中查找键-值对,想要打印出全局变量与局部变量的字典映射,我们可以使用函数globals()和locals()。
Python有多个命名空间,因此需要有规则来规定,LEGB就是用来规定命名空间查找顺序的规则顺序为:local-->enclosing function locals-->global-->builtin。

 LEGB原则如下:

 函数中变量命令空间易错点:

1.python赋值语句特殊 。

下图这个,会报错UnboundLocalError: local variable 'b' referenced before assignment,说b未赋值就引用了。

本质原因是python在赋值语句中先看左边变量是否在局部命名空间中有同名的,且无global等关键字对其声明(用到全局变量必须global,但是不建议这样使用,全局变量一般被多个函数用到,如果随意更改则会导致意想不到的各种错误)。如果存在则按LEGB原则处理,否则python会自己在局部命名空间新建此局部变量使用,再计算赋值语句右边的公式,其余情况均按LEGB法则。

这个例子是先发现赋值语句左边变量b在函数a中无同名的变量,也没有global b,所以新建了一个局部变量b,然后开始计算b+1,但是此时局部变量b只声明并没有赋值,所以b+1无法计算,导致报错。

有个办法解决:1.将赋值语句左边b改为一个新的变量名   print(新变量)  2.在a()中global下b,表示此b也就是全局变量b。

2.类变量最好用类名.变量名方式访问,防止类变量和实例变量混合。-------需要后续理解后补充。

3.python中for循环会污染命名空间,在C语言中for循环中的局部变量会随着循环语句而结束释放掉。但python中却不会,局部变量会影响循环后的代码。

C语言中循环结束后,此i会不存在,而python中循环结束后,还可以访问到i,而且i是最后循环结束时候的值。此段代码结果是9.

猜你喜欢

转载自www.cnblogs.com/lovestarmoon/p/10223908.html