开发者社区 问答 正文

关于python作用域的问题?报错

局部作用域里的代码可以读外部作用域(包括全局作用域)里的变量,我写了两段代码如下:

第一段:

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”?

展开
收起
爱吃鱼的程序员 2020-06-22 14:17:42 527 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

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

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

    •Unqualifiednames(e.g.,X)dealwithscopes.
    •Qualifiedattributenames(e.g.,object.X)useobjectnamespaces.

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

    谢谢~明白了~

    def里加个globali试试


    http://blog.sina.com.cn/s/blog_76e94d210100vxur.html

    不行的,i是在class作用域里的,也不是global的,除非两个i都加global,但这就不是我要说的意思了~python的语法是这样的,引用对象的属性一定要用self.i,直接i就是全局或函数的局部变量恩~谢谢~~

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

    应该好好看看python的面向对象。

    2020-06-22 14:17:59
    赞同 展开评论
问答分类:
问答标签:
问答地址: