2015-01-09 5 views
-2

Вот мой код для добавления словаря в другой словарьДобавить словарь в другой словарь в Python

dict_temp = {} 
logs = {} 
for d in e: 
     count +=1 
     dict_temp['email']= d["sent_to"] 
     dict_temp['log_id']= d["unique_arguments"] 
     print dict_temp 
     logs[count] = dict_temp 
     dict_temp.clear() 
    print logs 

словарь dict_temp прекрасно построен, но когда я добавить этот словарь в журналы dictonar взглянуть на словарь когда я печатаю его, он пуст. и вот выход;

{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                         
{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                         
{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                         
{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                         
{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                         
{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                         
{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                            
{'log_id': u'[email protected]', 'email': u'[email protected]'}                         
{1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {}, 8: {}, 9: {}, 10: {}, 11: {}, 12: {}, 13: {}, 14: {}, 15: {}, 16: {}, 17: {}, 18: {}, 19: {}, 20: {}, 21: {}} 
+0

Подсказка: отметьте '[id (x) для x в logs.values ​​()]' –

ответ

3

Вы добавляете объект же словарь снова и снова. Вы не добавляете копию. Таким образом, вы будете в конечном итоге все ссылки на этот словарь, показывая то же содержание:

>>> inner = {} 
>>> outer = {} 
>>> inner['foo'] = 'bar' 
>>> outer['inner_key'] = inner 
>>> outer 
{'inner_key': {'foo': 'bar'}} 
>>> inner['foo'] = 'baz' 
>>> outer 
{'inner_key': {'foo': 'baz'}} 
>>> inner.clear() 
>>> outer 
{'inner_key': {}} 
>>> outer['another_key'] = inner 
>>> outer 
{'another_key': {}, 'inner_key': {}} 
>>> inner['foo'] = 'spam' 
>>> outer 
{'another_key': {'foo': 'spam'}, 'inner_key': {'foo': 'spam'}} 

Обратите внимание, как любые изменения в inner отражаются при печати outer словаря, так как одни и те же цели. Добавление большего количества ключей, чтобы указать на этот один словарь только создали больше ссылок, а не копирует:

>>> id(inner), id(outer['inner_key']), id(outer['another_key']) 
(4413825104, 4413825104, 4413825104) 
>>> inner is outer['inner_key'] 
True 
>>> inner is outer['another_key'] 
True 

Используйте новый словарь:

logs = {} 
for d in e: 
    count +=1 
    new_dict = {'email': d["sent_to"], 'log_id': d["unique_arguments"]} 
    logs[count] = new_dict 

Другим вариантом было бы создание (мелкой) копия словарь, используя dict.copy(), но так как вы заменяете оба ключа полностью в любом случае действительно нет смысла делать это здесь.

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