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

Sas*_*iha 3 python dictionary python-3.x

在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)
Run Code Online (Sandbox Code Playgroud)

上面的代码产生以下输出:

{'name': 'user1', 'salary': '4k'}
{'name': 'user1', 'salary': '4k'}
{'name': 'user1', 'salary': '4k'}
Run Code Online (Sandbox Code Playgroud)

但我期待低于输出:

{'name': 'user1', 'salary': '2k'}
{'name': 'user1', 'salary': '3k'}
{'name': 'user1', 'salary': '4k'}
Run Code Online (Sandbox Code Playgroud)

Apprantely python仅修改现有字典,不创建新字典.我该怎么做才能解决这个问题?

是否存在从现有字典对象创建新字典对象的方法?还有其他更适合这个的系列吗?

Bak*_*riu 7

正如已经指出的那样,你在循环中做什么并不重要:

for ob_dict_obj in ob_dict_list:
    print(ob_dict)    # wrong!
Run Code Online (Sandbox Code Playgroud)

它始终打印值,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)
Run Code Online (Sandbox Code Playgroud)

复制字典有很多种方法,比如只是做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)
Run Code Online (Sandbox Code Playgroud)

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

所有内置投币器的行为都相同dict:更新方法只需修改当前对象,您必须明确复制对象以避免副作用.