2016-04-01 3 views
1

У меня есть python OrderedDict, и все, когда я обновляю только одно значение ключа, все остальные пары ключ-значение также получают обновление. У меня есть как исходный код, так и след ниже.OrderedDict, обновляющий все пары ключ-значение, когда предназначен только для обновления одной пары ключ-значение

Я ожидаю наличия пары ключей (2014, {'start': 2014, 'end': 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})]) 
+0

Все ключи имеют ссылку на тот же экземпляр словаря, что и его значение. –

ответ

2

В

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

присвоенные каждому 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 {} 
+0

Отличное объяснение, не могли бы вы предложить подходящее решение? Даже советы по устранению проблемы? –

0

Чтобы устранить эту проблему, используйте вместо этого d[i] = intial_value.copy(), чтобы каждая запись представляла собой пустой пустой dict.

Смежные вопросы