为了账号安全,请及时绑定邮箱和手机立即绑定

关于python作用域的问题

关于python作用域的问题

慕田峪7331174 2018-07-18 10:08:16
局部作用域里的代码可以读外部作用域(包括全局作用域)里的变量,我写了两段代码如下:第一段:def b(): g=0 def a(): print(g) return a b()()可以正常显示0,表示a()函数可以读取外部的变量g。第二段:class a(): i=10 def fun(self): print(self.i)  #print(i)就会报错NameError: global name 'i' is not defined wa=a() wa.fun()这个fun()函数也能正确显示10,表示可以读取外部的变量,但是为什么在类中定义就必须要print(self.i)呢?为什么print(i)就会报错“NameError: global name 'i' is not defined”?
查看完整描述

4 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

Python里的name查找是满足LEGB规则的(local =>enclosed=>global=>build-in),所以第一段代码完全OK;

但第二段就涉及到class的命名空间问题了,learning python里是这么说的:

• Unqualified names (e.g., X) deal with scopes.
• Qualified attribute names (e.g., object.X) use object namespaces.

总之,如果直接print i的话,就会按照LEGB准则来查找,而这里的i是在a的一个属性,在fun的作用域中是找不到的,所以就出错啦~~~


查看完整回答
反对 回复 2018-07-19
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

python的语法是这样的,引用对象的属性一定要用self.i,直接i就是全局或函数的局部变量

查看完整回答
反对 回复 2018-07-19
?
收到一只叮咚

TA贡献1821条经验 获得超5个赞

第二个例子里, i是一个类变量

查看完整回答
反对 回复 2018-07-19
  • 4 回答
  • 0 关注
  • 310 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号