这是Python名称解析规则的产物: 您只能访问全局和局部作用域,而不能访问它们之间的作用域,例如,不能访问您的直接外部作用域。
编辑: 上面的措辞很差,您 确实 可以访问在外部作用域中定义的变量,但是通过执行 *** 作
x = x或
mymethod =mymethod从非全局名称空间访问,实际上是用您在本地定义的变量掩盖了外部变量。
在示例2中,您的直接外部作用域是全局作用域,因此
MyClass可以看到
mymethod,但是在示例4中,您的直接外部作用域是
my_defining_func(),所以不能,因为的外部定义
mymethod已经被其局部定义掩盖了。
有关非本地名称解析的更多详细信息,请参见PEP 3104。
另请注意,由于上述原因,我无法让示例3在Python 2.6.5或3.1.2下运行:
>>> def myfunc():... x = 3... class MyClass(object):... x = x... return MyClass... >>> myfunc().xTraceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in myfunc File "<stdin>", line 4, in MyClassNameError: name 'x' is not defined
但是以下方法会起作用:
>>> def myfunc():... x = 3... class MyClass(object):... y = x... return MyClass... >>> myfunc().y3
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)