在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'}
Apparantely python仅修改现有字典,不创建新字典。我该怎么做才能解决这个问题?
是否存在从现有字典对象创建新字典对象的方法? 还有其他更适合这个的系列吗?
答案 0 :(得分: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
相同:更新方法只需修改当前对象,您必须明确复制对象以避免副作用。
答案 1 :(得分: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()方法将新项添加到词典中。