Python 当类在定义中具有列表理解时,变量会发生更改吗?
看一看这个简单的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
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的事情