为了说明这个问题,我创建了一个简单的例子:
#!/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...
函数被一次又一次地调用。怎么了?
问题不在于setdefault
,但Python(以及大多数语言)的一般原则是,在调用函数之前必须评估所有参数。也就是说,即使在 Python 检查键是否在字典中之前,它也需要知道键的值和默认值:并且由于默认值是函数的结果,因此必须首先调用该函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)