【发布时间】:2012-06-03 00:03:36
【问题描述】:
下面是我的部分类定义:
class Trial:
font = pygame.font.Font(None, font_size)
target_dic = {let: font.render(let, True, WHITE, BG) for let in list("ABCDEFGHJKLMNPRSTUVWX")}
部分类定义的最后一行,target_dic = {let: font.render(let, True, WHITE, BG) for let in list("ABCDEFGHJKLMNPRSTUVWX") 返回错误:未定义全局名称'font'。很公平。
但是,我尝试了以下测试用例并没有出错:
class x:
dat = 1
datlist = [dat for i in range(10)]
为什么第一种情况不起作用?达到字典理解时成员font不存在吗?
我是否需要将这些操作移至__init__,或者是否可以在创建类对象时只定义一次列表?
编辑:
为了清楚起见,我希望能够在创建类对象时填充列表,以减少创建 Trial 对象所花费的时间。
【问题讨论】:
-
list("ABC...")中的list()是多余的;字符串本身就是可迭代的,所以for ... in "ABC.."可以独立工作。 -
第二个测试用例也会导致错误(
self未定义)。 -
我认为你应该在第一种情况下使用
Trial.font。我不认为你可以像那样直接引用类属性。 -
有趣。在 dict 理解或生成器表达式中使用变量
font时会出错。但是在列表推导中使用它没有错误。 -
Class attribute evaluation and generators 的可能副本。这个问题是关于生成器表达式而不是 dict 理解,但原因是一样的。
标签: python