内部python类、模块或函数范围的初始化

内部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

下面的代码使用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):
        print(x)
        x = x
a2()

在附加的内部函数中使用行
x=x
是一个语法错误,这很好。但在函数的内部类中,这似乎是可以接受的,尽管语义相当奇怪?

当您在类定义中定义变量时,实际上是在分配该类的属性,但当您引用变量时,您可能引用该类的属性或外部变量。因此,当您说
x=x
时,这与说
C2.x=x

是相同,x是一个新的类变量。我想知道的是,为什么初始化该类变量的x的计算会被计算到周围的模块范围,而不是周围的函数范围。无论是
m
还是
a1a2
都可以。但是为什么
a1 m