python命名空间更改_初学python命名空间和LEGB原则

Python的命名空间是一个字典,字典内保存了变量名称与对象之间的映射关系,因此,查找变量名就是在命名空间字典中查找键-值对,想要打印出全局变量与局部变量的字典映射,我们可以使用函数globals()和locals()。

Python有多个命名空间,因此需要有规则来规定,LEGB就是用来规定命名空间查找顺序的规则,顺序为:local-->enclosing function locals-->global-->builtin。

LEGB原则如下:

1014174-20190105111351333-641904843.png

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

1.python赋值语句特殊 。

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

1014174-20190105113357227-1730568074.png

本质原因是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.

1014174-20190105115050349-996681670.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值