2016-02-16 19 views
1

以下代码打印a1 m与python2,python3,Jython和pypy的。因此,我认为这是想要的行为。不过,我不明白为什么在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是一个语法错误,这是好的。但是,在一个内部类的函数中,这似乎是可以接受的,虽然有相当怪异的语义?

回答

1

当你定义一个类定义中的变量,你真的是分配类的属性,但是当你引用一个变量,你可能会被引用类外部变量的属性。因此,当你说x = x,就等于说C2.x = x

+0

是,x是那么一个新的类变量。我想知道为什么是x的是初始化的类变量评估进行评估,以周边模块范围,而不是周围的功能范围。这两个'M M'或'A1 a2'会莫名其妙的罚款。但为什么'a1 m' – pba