如何在for循环中创建一个新的字典?

3
在Python 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'}

显然,Python只修改现有的字典而不创建新的字典。我该怎么解决这个问题?

是否存在一种从现有字典对象中创建新字典对象的方法? 是否有其他更适合此操作的集合类型?

2个回答

8
正如已经指出的那样,无论您做什么,在循环中您都会有这个问题:
for ob_dict_obj in ob_dict_list:
    print(ob_dict)    # wrong!

无论您在ob_dict_list中放入什么值,它总是打印ob_dict的值。


这意味着您正在修改唯一的字典。您想为每个迭代创建一个新的字典:

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()。然而,据我所知,没有一种单一的方法可以同时复制和更新字典。

但是,此时在循环外部拥有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相同:更新方法只是修改当前对象,你必须显式地复制对象以避免产生副作用。

另外,你应该打印 og_dict_obj 而不是 og_dict - Prashant
@PrashantSethi 哦,是的。我从 OP 处复制并粘贴了代码。我也加了一条注释(尽管我希望这只是 OP 在这里写代码时的一个笔误)。 - Bakuriu
是的,使用 og_dict 而不是 og_dict_obj 是一个打字错误。感谢您的回答。 由于某些原因,我无法使用第二种解决方案... - Sasuke Uchiha

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()方法向字典中添加新的元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接