【发布时间】:2019-02-15 17:42:03
【问题描述】:
我正在尝试向现有字典添加新键,将前一个键的值设置为默认值。
def check_data(end, start, profile):
print(profile)
for day in range((end-start).days+1):
profile.setdefault(start+datetime.timedelta(day),
{'expediture':0, 'top-up':0,
'budget':profile[start+datetime.timedelta(day-1)]['budget'] })
start = datetime.date(2019,2,1)
end = datetime.date(2019,2,17)
check_data(end, start, month_data)
print(profile)的输出:
{datetime.date(2019, 2, 1): {'expediture': 0, 'top-up': 0, 'budget': 100.0}}
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-4-e44462627692> in <module>
----> 1 check_data(end, start, month_data)
<ipython-input-2-90b936150b04> in check_data(end, start, profile)
20 profile.setdefault(start+datetime.timedelta(day),
21 {'expediture':0, 'top-up':0,
---> 22
'budget':profile[start+datetime.timedelta(day-1)]['budget'] })
23
24 def add_money(profile, topup, date=datetime.date.today()):
KeyError: datetime.date(2019, 1, 31)
我不明白为什么setdefault() 试图将默认值设置为
datetime.date(2019, 2, 1) 如果这个值已经存在。
我可以用if 解决这个问题,但我想了解setdefault 是如何工作的,也许这个问题有其他解决方案。
【问题讨论】:
-
setdefault的第二个参数在setdefault实际运行之前进行评估。 -
函数的所有参数在函数被调用之前都会被完全评估——无论该函数是否真的要使用特定的参数。因此,在这种情况下,您将无条件地创建支出/充值/预算字典,即使在第一天,由于缺少前一天,预算计算也会失败。
-
感谢您的解释!
标签: python dictionary setdefault