2016-03-06 2 views
1

В питон 3.5.1как создать новый словарь для цикла?

og_dict = {'name':'user1', 'salary':'1k'} 
og_dict_list =[] 
for i in range(2,5): 
    og_dict['salary'] = str(i)+'k' 
    og_dict_list.append(og_dict) 
for og_dict_obj in og_dict_list: 
    print(og_dict_obj) 

Приведенный выше код производит следующий вывод:

{'name': 'user1', 'salary': '4k'} 
{'name': 'user1', 'salary': '4k'} 
{'name': 'user1', 'salary': '4k'} 

Но я ожидал ниже выхода:

{'name': 'user1', 'salary': '2k'} 
{'name': 'user1', 'salary': '3k'} 
{'name': 'user1', 'salary': '4k'} 

Apparantely питон модифицирует существующий словарь только и делает не создавать новую. Что я могу сделать для решения этой проблемы?

Есть ли способ создать новый объект словаря из существующего? Есть ли другая коллекция, которая больше подходит для этого?

ответ

6

Как уже отмечалось, это не имеет значения, что вы делаете, когда в цикле у вас есть:

for ob_dict_obj in ob_dict_list: 
    print(ob_dict) # wrong! 

всегда напечатает значение для ob_dict и не имеет значения, какие ценности вы положили в ob_dict_list.


Это говорит, что проблема в том, что вы модификациитолько словарь. Вы хотите создать новый для каждой итерации:

og_dict = {'name':'user1', 'salary':'1k'} 
og_dict_list =[] 
for i in range(2,5): 
    new = og_dict.copy() 
    new['salary'] = str(i)+'k' 
    og_dict_list.append(new) 
for og_dict_obj in og_dict_list: 
    print(og_dict_obj) 

Там есть несколько способов, чтобы скопировать словарь, как просто делать dict(of_dict) вместо вызова .copy(). Тем не менее, AFAIK, нет единого метода, который позволяет копировать & одновременно обновлять словарь.

Однако нет особого смысла в том, чтобы в og_dict вне цикла в данный момент:

og_dict_list =[] 
for i in range(2,5): 
    og_dict = {'name':'user1', 'salary':str(i) +'k'} 
    og_dict_list.append(og_dict) 
for og_dict_obj in og_dict_list: 
    print(og_dict_obj) 

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

Все встроенных cointainers действуют так же, как dict: методы обновления просто изменить текущий объект, и вы должны явным образом скопировать объект, чтобы избежать побочных эффектов.

+0

Кроме того, вы должны печатать 'og_dict_obj', а не' og_dict' –

+0

@PrashantSethi О да. Я копирую и вставляю из OP. Добавлено примечание об этом тоже (хотя я надеюсь, что это была просто опечатка в OP-коде, когда он написал ее здесь). – Bakuriu

+0

Да, og_dict вместо og_dict_obj был опечаткой. Спасибо за ответ. По какой-то причине я не могу использовать второе решение .. –

0
og_dict_list =[] 
for i in range(2,5): 
    og_dict = {'name':'user1', 'salary':str(i) +'k'} 
    og_dict_list.append(og_dict) 

for og_dict_obj in og_dict_list: 
    print(og_dict_obj)`enter code here 

Всегда есть лучший способ сделать это. Вы также можете использовать метод update() в Python для добавления новых элементов в словари.

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