5

为了说明问题,我创建了一个简单的示例:

#!/usr/bin/env python

class Person():
    def __init__(self):
        self.cache = {}

    def get_person_age(self):
        def get_age():
            print "Calculating age..."
            return self.age
        print self.cache
        return self.cache.setdefault(self.name, get_age())

    def set_person(self, name, age):
        self.name = name
        self.age = age


p = Person()
p.set_person('andrei', 12)

for k in range(0, 5):
    p.get_person_age()

我希望一旦设置了缓存,将永远不会再次调用函数 get_person_age ,但这不是真的:

$ python cache_test.py 
{}
Calculating age...
{'andrei': 12}
Calculating age...
{'andrei': 12}
Calculating age...
{'andrei': 12}
Calculating age...
{'andrei': 12}
Calculating age...

函数被一次又一次地调用。怎么了?

4

1 回答 1

10

问题不在于setdefault,而在于 Python(以及大多数语言)中的一般原则,即必须在调用函数之前评估所有参数。也就是说,即使在 Python 检查键是否在字典中之前,它也需要知道键的值和默认值:由于默认值是函数的结果,因此必须首先调用该函数.

于 2014-04-01T21:33:03.510 回答