Python 当类在定义中具有列表理解时,变量会发生更改吗?

Python 当类在定义中具有列表理解时,变量会发生更改吗?,python,Python,看一看这个简单的Python代码: class A: x = 123 y = [(x,x*x) for x in [1,2,3]] print A().x A.x是123,但当我执行A().x时,它会打印3。为什么? $ python a.py 3 您已覆盖列表中的x。应该使用另一个名称。这是一种与py2.x相关的行为。在py2.x中,列表理解没有自己的作用域。因此,在您的例子中,列表理解实际上修改了变量x,并且x在列表理解结束时被赋值为3,因此您将得到A().x和A.x

看一看这个简单的Python代码:

class A:
    x = 123
    y = [(x,x*x) for x in [1,2,3]]

print A().x
A.x
123
,但当我执行
A().x
时,它会打印
3
。为什么?

$ python a.py 
3

您已覆盖列表中的
x
。应该使用另一个名称。

这是一种与py2.x相关的行为。在py2.x中,列表理解没有自己的作用域。因此,在您的例子中,列表理解实际上修改了变量
x
,并且
x
在列表理解结束时被赋值为
3
,因此您将得到
A().x
A.x
3

:

…尤其是回路控制变量不再泄漏 进入周围范围


在我的Python 3.3中,它打印123。@mayaa:请看重复问题,这是一个Python 2.x问题,其中列表理解的变量范围处理方式不同。@MartijnPieters:这不是同一个问题。也许答案涵盖了这个问题,但要通读大量字节码才能发现…这是同一个基本问题。也是一个重复,减去类范围。但类定义中没有范围?为什么会有一个呢?我能想到的唯一原因是,如果你被允许做类似于
class-A:if-True:z=4
@Dog的事情