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 に答える