类中定义的变量在Python 3中给出了一个错误

类中定义的变量在Python 3中给出了一个错误,python,list,class,python-3.6,Python,List,Class,Python 3.6,以下简单代码给出了Python 3.6中的一个错误(但在2.7中是OK): 当我将相同的代码放在函数中而不是类中时:defxy():…它可以工作。当我在常规循环中滚动列表时,它也会起作用。Python2.7使用的代码与3.6中给出错误的代码相同 知道从列表理解中访问本地类变量有什么问题吗?您可以在XY的\uuuuuu init\uuuu方法中创建z: class XY: pre = '' def __init__(self): self.z = [self.pre +

以下简单代码给出了Python 3.6中的一个错误(但在2.7中是OK):

当我将相同的代码放在函数中而不是类中时:
defxy():…
它可以工作。当我在常规循环中滚动列表时,它也会起作用。Python2.7使用的代码与3.6中给出错误的代码相同


知道从列表理解中访问本地类变量有什么问题吗?

您可以在
XY
\uuuuuu init\uuuu
方法中创建
z

class XY:
   pre = ''
   def __init__(self):
       self.z = [self.pre + a for a in ['x', 'y']]

列表理解现在使用一个函数作用域,这是Python2和Python3之间的一个变化。因此,无法从列表中访问变量
pre

新行为记录在(我的重点)下,给出的示例与您发现的示例非常相似:

exec()
eval()
的类定义块和参数在名称解析上下文中是特殊的。类定义是可以使用和定义名称的可执行语句。这些引用遵循名称解析的正常规则,但在全局名称空间中查找未绑定的局部变量除外。类定义的命名空间将成为该类的属性字典类块中定义的名称范围仅限于类块;它不扩展到方法的代码块–这包括理解和生成器表达式,因为它们是使用函数作用域实现的。这意味着以下操作将失败:


此外,
pre
名称也将无法通过类
XY.pre
访问,因为该类尚不存在。你必须找到另一种方法去做你想做的事

可能您正在寻找创建一个函数而不是类(目前它是类)。如果是类,那么您的此逻辑应该在类的任何functionAre
x
y
中正确初始化?
class XY:
   pre = ''
   def __init__(self):
       self.z = [self.pre + a for a in ['x', 'y']]
class A:
    a = 42
    b = list(a + i for i in range(10))