虽然有很多方法可以解决这个问题,但由于性格上的缺陷,在我了解失败的本质之前,我不能放过它。
正在尝试:

class OurFavAnimals(object):
    FAVE = 'THATS ONE OF OUR FAVORITES'
    NOTFAVE = 'NAH WE DONT CARE FOR THAT ONE'
    UNKNOWN = 'WHAT?'
    FAVES = defaultdict(lambda: UNKNOWN, {x:FAVE for x in ['dog', 'cat']})
    FAVES['Crab'] = NOTFAVE

失败原因:
      3     NOTFAVE = 'NAH WE DONT CARE FOR THAT ONE'
      4     UNKNOWN = 'WHAT?'
----> 5     FAVES = defaultdict(lambda: UNKNOWN, {x:FAVE for x in ['dog', 'cat']})
      6     FAVES['Crab'] = NOTFAVE

NameError: global name 'FAVE' is not defined

为什么?为什么它能找到UNKNOWN而不是FAVE?是因为它在字典里?

最佳答案

是的,这是因为它在字典理解中。注意,它也不是“查找”UNKNOWN;它只是还没有查找它,因为UNKNOWN只在lambda中引用。如果用其他方法替换您的DICT理解以允许类定义成功,则如果您尝试访问不存在的密钥(因为它将尝试调用该lambda),则稍后会出错。所以如果你把它改成

FAVES = defaultdict(lambda: UNKNOWN, {'a': 1})

你会得到:
>>> OurFavAnimals.FAVES['x']
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    OurFavAnimals.FAVES['x']
  File "<pyshell#2>", line 5, in <lambda>
    FAVES = defaultdict(lambda: UNKNOWN, {'a': 1})
NameError: global name 'UNKNOWN' is not defined

在这两种情况下,原因都是类作用域中定义的变量在嵌套作用域中不可用。换句话说,这也是失败的原因:
class Foo(object):
    something = "Hello"
    def meth(self):
        print(something)

lambda和dictionary comprehension都创建嵌套在类作用域中的函数作用域,因此它们不能直接访问类变量。另请参见this related question

关于python - 字典类属性,它引用定义中的其他类属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32257783/

10-12 20:58