内部python类、模块或函数范围的初始化
下面的代码使用python2、python3、jython和pypy打印内部python类、模块或函数范围的初始化,python,class,scoping,Python,Class,Scoping,下面的代码使用python2、python3、jython和pypy打印a1 m。因此,我认为这是被通缉的行为。但是,我不明白为什么在C1类范围x中使用周围的功能范围进行评估,而在C2中,以下x=x使用周围的模块范围对前面的x进行评估 x = "m" def a1(): x = "a1" class C1(object): print(x) a1() def a2(): x = "a2" class C2(object): prin
a1 m
。因此,我认为这是被通缉的行为。但是,我不明白为什么在C1
类范围x
中使用周围的功能范围进行评估,而在C2
中,以下x=x
使用周围的模块范围对前面的x
进行评估
x = "m"
def a1():
x = "a1"
class C1(object):
print(x)
a1()
def a2():
x = "a2"
class C2(object):
print(x)
x = x
a2()
在附加的内部函数中使用行
x=x
是一个语法错误,这很好。但在函数的内部类中,这似乎是可以接受的,尽管语义相当奇怪?当您在类定义中定义变量时,实际上是在分配该类的属性,但当您引用变量时,您可能引用该类的属性或外部变量。因此,当您说x=x
时,这与说C2.x=x
是相同,x是一个新的类变量。我想知道的是,为什么初始化该类变量的x的计算会被计算到周围的模块范围,而不是周围的函数范围。无论是m
还是a1a2
都可以。但是为什么a1 m