使用类变量通过列表推导将另一个类变量初始化

时间:2017-02-03 20:31:26

标签: python python-3.x namespaces list-comprehension

正如我理解类一样,在解析类时,任何类级属性都被解释为本地命名空间的成员。因此,类似下面的内容非常有意义并且按预期工作:

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+的解释特别感兴趣,但旧版本对我来说也是理论上的兴趣。

0 个答案:

没有答案