设为首页 收藏本站
查看: 969|回复: 0

[经验分享] 零基础学python-16.3 变量名解析:LEGB原则

[复制链接]

尚未签到

发表于 2017-5-8 09:30:10 | 显示全部楼层 |阅读模式
  这一章节我们来说说变量名解析的原则:LEGB原则
  1.当函数使用未认证的变量名时,python搜索4个作用域,本地作用域(L)->上一层结构中def或者lambda的本地作用域(E)->全局作用域(G)>内置作用域(B),并且在第一次找到这个变量名的地方停下来
DSC0000.jpg

  2.函数给一个变量赋值的时候,总是创建或者改变本地作用域的变量名,除法他是声明为全局

>>> def test():
x=1
print(x)
print(id(x))
x=2
print(x)
print(id(x))

>>> test()
1
505991632
2
505991648
>>>


在test,我们第一次赋值给x的时候创建了变量,然后后面又改变了变量x,如果x是全局变量时,就会如下:
x='e f t efdad'
def test():
print(x)
print(id(x))
#x=123
#print(x)
#print(id(x))
if __name__=='__main__':
test()



但是,我们需要注意一点,看见上面代码里面的注释没有,如果注释放开了,他就会报错了,为什么?
x='e f t efdad'
def test():
print(x)
print(id(x))
x=123
print(x)
print(id(x))
if __name__=='__main__':
test()



输出:
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "C:\Python34\test.py", line 9, in <module>
test()
File "C:\Python34\test.py", line 3, in test
print(x)
UnboundLocalError: local variable 'x' referenced before assignment
>>>


没有找到本地变量x,我认为是这样的,虽然py是解释性的语言,但是他还是需要编译成pyc文件来执行,只不过这个过程我们看不见,在编译的过程中x其实已经被认定为本地变量,而不再是模块里面的全局变量,所以才会出现这种情况,那么怎么解决?我们只需要在改动x前面加上global x即可,global关键字我们下面的章节会详细讲述
x='e f t efdad'
def test():
print(x)
print(id(x))
global x
x=123
print(x)
print(id(x))
if __name__=='__main__':
test()



输出:
>>> ================================ RESTART ================================
>>>
e f t efdad
31843176
123
505993584
>>>


上面的代码保存为test.py然后运行即可  3.在函数之外给一个变量赋值(在模块顶层或者idle),本地作用域和模块的命名空间是相同的
  

  总结:这一章节主要简单说明了变量名解析的LEGB原则

这一章节就说到这里,谢谢大家


------------------------------------------------------------------


点击跳转零基础学python-目录



         
版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-374481-1-1.html 上篇帖子: 一个python程序员的ruby三日游(二)——第一天 ruby rspec 下篇帖子: 零基础学python-18.6 lambda表达式快速入门
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表