2016-04-01 17 views
1

Bir python OrderedDict var ve yalnızca bir anahtar/değer çiftini güncelleştirdiğimde, diğer tüm anahtar/değer çiftleri de güncelleştiriliyor. Hem kaynak kodunu hem de aşağıdan izleri var.OrderedDict yalnızca bir anahtar/değer çiftini güncellemeyi planladığında tüm anahtar/değer çiftlerini güncelleştiriyor

Anahtar çifti olmasını bekliyorum (2014, {'start': 2014, 'end': 2015}), ancak burada durum böyle değil.

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 

İade:

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

Tüm anahtarlar, değer olarak aynı sözlük örneğine başvurur. –

cevap

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 

size her atamak ve her d[i] aynı initial_value bir başvuru, bu durumda aynı sözlüğü

od = get_ordered_dict(start_year, end_year, {}) 

Yani kendi döngüsünde tekrar tekrar aynı sözlüğü değiştirirsiniz. benzersiz bir sözlük başvurusu atamak

bir yolu initial_value bir (sığ) kopyasını yapmak olacaktır:

d[i] = intial_value.copy() # [sic] 

Ayrıca initial_value bir anahtar kelime argüman yapabilir varsayılan None için:

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

Mükemmel bir açıklama, uygun bir çözüm sağlayabilir misiniz? Sorunu düzeltmek için ipuçları bile mi? –

0

Sorunu gidermek için, her girdinin farklı bir boş Dict olduğundan emin olmak için d[i] = intial_value.copy() kullanın.

İlgili konular