2013-08-21 2 views
1

У меня есть 7 словарей в программе, данные которой извлекаются с использованием ETREE, проблема в том, что python не создает отдельный экземпляр dict для каждого dict, как показано на выходе, всякий раз, когда я печатаю любой из эти dicts я получаю тот же вывод, который является большим словарем, имеющим объединение всех данных.Различные словари, имеющие один и тот же экземпляр

 
tr_dict,tr_text,exp_dict,exp_text,top_dict,top_text,times=[{}]*7 #create n empty dictionaries 
    for tr in transcript: 
     trtext = tr.find('TATION/ANNOTATION_VALUE').text 
     tr_time_ref = tr.find('TATION').attrib['TIME_SLOT_REF1'] 
     tr_ann_ref = tr.find('ATION').attrib['ANNOTATION_ID'] 

     tr_dict[tr_ann_ref] = tr_time_ref 
     tr_text[tr_time_ref]=trtext 

... 

Выход:

 
[Dbg]>>> exp_dict is exp_text 
True 
[Dbg]>>> tr_dict is tr_text 
True 
[Dbg]>>> tr_dict is exp_dict 
True 

Ofcourse Я не хочу, чтобы это произошло, я хочу питона, чтобы создать и использовать отдельную Dict для каждого.

+1

возможно дубликат [Python List Index] (http://stackoverflow.com/questions/13058458/python-list-index) – ecatmur

+0

Рассматривали ли вы tr_dict = {}, tr_text = {} и т. д.? – foosion

+0

@ecatmur спасибо за указание на настоящую причину (перейдите по ссылке), этот ярлык стоил мне времени :( – stackit

ответ

5

Вот проблема:

[{}] * 7 

ли это вместо:

[{}, {}, {}, {}, {}, {}, {}] 

Пояснение: первая строка будет создавать один словарь и скопировать семь ссылок на него в списке, в то время как второй line создает семь разных словарей - и это то, что вы хотите сделать. Кроме того, как указано в комментариях, это будет также работать:

[{} for _ in range(7)] 
+7

Или '[{} for _ in range (7)]', который не короче, но облегчает подсчет словарей , – delnan

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