局部作用域里的代码可以读外部作用域(包括全局作用域)里的变量,我写了两段代码如下:第一段: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的作用域中是找不到的,所以就出错啦~~~
- 4 回答
- 0 关注
- 310 浏览
添加回答
举报
0/150
提交
取消