2016-03-06 217 views
1

在蟒蛇3.5.1如何在for循环中创建新字典?

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) 

要回答你的更广泛的问题:行为的您正在寻找的那种典型的功能具有持久数据结构的语言。然而,在命令式语言中,复制&更新将是一种简单的方法,通过创建大量不需要的副本来拍摄自己。

全部内置币计算器的行为与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 

总是有更好的方法来做到这一点。您也可以使用Python中的update()方法将新项添加到字典中。