正如我理解类一样,在解析类时,任何类级属性都被解释为本地命名空间的成员。因此,类似下面的内容非常有意义并且按预期工作:
x = 5
class A:
x = 4
y = x + 4
print(A.y)
8
但是,无法在列表理解的表达式部分中使用y
初始化x
:
# implicit `del x`
class A:
x = 4
y = [2 * x for _ in range(4)]
....
NameError: name 'x' is not defined
奇怪的是,可以在条件中使用x
:
class A:
x = (1, 2, 3)
y = [2 * i for i in x]
print(A.y)
[2, 4, 6]
我在y = [2 * x for _ in range(4)]
案例中看到了几种解决方法。最简单的方法是将其重写为y = [2 * x] * 4
。上面的示例中已经修复了y = [2 * x[i] for i in range(len(x))]
更有用的案例。在任何一种情况下,都存在一个名称空间问题,我在这里无法理解。
我想知道A)这里的命名空间是怎么回事?和B)我如何解决它(除了这里显示的微不足道的重写)?
所有这些都是在Red Hat机器上的Anaconda安装的Python 3.5.2下运行的。我对Python 3.5+的解释特别感兴趣,但旧版本对我来说也是理论上的兴趣。