OrderedDict仅在更新一个键值对时更新所有键值对

时间:2016-04-01 16:07:28

标签: python dictionary ordereddictionary

我有一个python OrderedDict,当我只更新一个键值时,所有其他键值对也都会更新。我已经包含了源代码和下面的跟踪。

我期待有一对密钥对(2014年,{'start':2014年,'结束':2015年}),但这不是这里的情况。

import datetime
import collections
import math
from decimal import Decimal
from dateutil.relativedelta import relativedelta



def get_ordered_dict(start, end, intial_value):
    d = collections.OrderedDict()
    for i in range(start, end+1):
        d[i] = intial_value
    return d


start_year = 2014
end_year = start_year + 39 + 1
od = get_ordered_dict(start_year, end_year, {} )

for year in od.keys():
    print year
    d = od[year]
    d['start'] = year
    d['end'] = year + 1
    print od

返回:

OrderedDict([(2014, {'end': 2053, 'start': 2052}),
             (2015, {'end': 2053, 'start': 2052}),
             (2016, {'end': 2053, 'start': 2052}),
             (2017, {'end': 2053, 'start': 2052}),
             (2018, {'end': 2053, 'start': 2052}),
             (2019, {'end': 2053, 'start': 2052}),
             (2020, {'end': 2053, 'start': 2052}),
             (2021, {'end': 2053, 'start': 2052}),
             (2022, {'end': 2053, 'start': 2052}),
             (2023, {'end': 2053, 'start': 2052}),
             (2024, {'end': 2053, 'start': 2052}),
             (2025, {'end': 2053, 'start': 2052}),
             (2026, {'end': 2053, 'start': 2052}),
             (2027, {'end': 2053, 'start': 2052}),
             (2028, {'end': 2053, 'start': 2052}),
             (2029, {'end': 2053, 'start': 2052}),
             (2030, {'end': 2053, 'start': 2052}),
             (2031, {'end': 2053, 'start': 2052}),
             (2032, {'end': 2053, 'start': 2052}),
             (2033, {'end': 2053, 'start': 2052}),
             (2034, {'end': 2053, 'start': 2052}),
             (2035, {'end': 2053, 'start': 2052}),
             (2036, {'end': 2053, 'start': 2052}),
             (2037, {'end': 2053, 'start': 2052}),
             (2038, {'end': 2053, 'start': 2052}),
             (2039, {'end': 2053, 'start': 2052}),
             (2040, {'end': 2053, 'start': 2052}),
             (2041, {'end': 2053, 'start': 2052}),
             (2042, {'end': 2053, 'start': 2052})])

2 个答案:

答案 0 :(得分:2)

d[i]

您为每个initial_value分配了对同一od = get_ordered_dict(start_year, end_year, {}) 的引用,在这种情况下是相同的字典

initial_value

因此,在你的循环中,你反复修改同一个字典。

分配唯一字典引用的一种方法是制作d[i] = intial_value.copy() # [sic] 的(浅)副本:

initial_value

您还可以将None设为默认为def get_ordered_dict(start, end, intial_value=None): ... # assuming intial_value will always be a dict d[i] = intial_value.copy() if intial_value is not None else {} 的关键字参数:

{{1}}

答案 1 :(得分:0)

要解决此问题,请改用d[i] = intial_value.copy()以确保每个条目都是不同的空字典。