Python中使用 [列表生成式] 创建类属性失败的问题

在创建类时,遇到很奇怪的问题,主要原因是提示引用了不存在的变量,以下用具体代码进行说明.

class Stu_A(object):
    name='student{}'
    other_name=name.format('A')
    def __init__(self):
        pass
a=Stu_A()
print(a.other_name)

以上代码是可以正确运行的,但是如果再增加一个类属性的话(该类属性是以之前属性格式化而生成的列表),就会提示变量没有被定义的的错误,代码如下:

class Stu_B(object):
    name='student{}'
    other_name=name.format('A')
    name_list = [name.format(i) for i in 'BCDE']
    def __init__(self):
        pass
    
b=Stu_B()
print(b.name_list)

Stu_B 这个类无法被创建

提示的错误信息: NameError: name 'name' is not defined

在Stu_A类中,other_name属性同样是用name属性格式化而来的,可以正常运行.

但在Stu_B中,使用一个列表生成式去格式化name属性而创建一个列表,却不行呢?

希望有大神能给解答一下,感谢!

阅读 4.8k
3 个回答

正确的解释请看这里 https://stackoverflow.com/que...

这个问题涉及到两个知识点:

  • Class Definition 的作用域是很特殊的,不会延伸至其内部的其他作用域(函数、推导式、次级类定义)中
  • 在 Python 3 中,为了防止变量污染,推导式有自己的作用域

如果你非要这么做也不是不可以,使用 lambda 创建一个立即执行函数就好了:

class A:
    x = 1
    y = (lambda x: [x for i in range(4)])(x)
新手上路,请多包涵

我在python 2.7.15上运行你的代码,没问题。python 3图片描述没试过。

在python3中:

[name.format(i) for i in 'BCDE']

等价于:

list(name.format(i) for i in 'BCDE')

这是一个函数调用。所以你如果要引用类属性name作为函数的变量,应该这样:

[类名.name.format(i) for i in 'BCDE']
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题