深度拷贝与浅拷贝的一个案例----dict中用list做value引起的问题
一个教程的练习时,碰到一个问题,代码如下:
#本练习是将以多个dict存储的员工信息,整理成一个以员工号为关键字,员工信息列表为value的字典;
#输入包括员工姓名dict、职位dict、薪资dict 及 年终奖dict四个字典,其共同的key是员工号;
#输出:以员工号为key,含有 姓名、职位、薪资、年终奖 为元素的list为 字典value的新的dict
#处理方案:先选一个输入dict,获取员工号,然后以员工号为key,以4个'0'为元素的list为value的dict;然后,分别将姓名、职位、薪资、年终奖提取到对应的list中;
******************************************************
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
"ex_func.py module"
__author__ = "Oldman"
import sys
import copy
def obtaining_staff_num(dict1,list_num): #从输入dict获取一个员工号list
for keys in dict1:
if keys not in list_num:
list_num.append(keys)
return 0
def create_staff_register(list_num,dict_num): #利用员工号list作为关键字生成一个空白的dict,
initial_list = ['0','0','0','0']
for num in range(len(list_num)):
dict_num[list_num[num]] = initial_list
return 0
def add_name_to_staff(dict_name,dict_num):
for key,value in dict_name.items():
dict_num[key][0] = value
return 0
def add_job_to_staff(dict_job,dict_num):
for key,value in dict_job.items():
dict_num[key][1] = value
return 0
def add_salary_to_staff(dict_salary,dict_num):
for key,value in dict_salary.items():
dict_num[key][2] = value
return 0
def add_bonus_to_staff(dict_bonus,dict_num):
for key,value in dict_bonus.items():
dict_num[key][3] = value
return 0
def main():
dict_name_of_staff ={
'0001':'张三',
'0002':'李四',
'0003':'王五',
'0004':'赵六',
'0005':'周七',
'0006':'吴八',
'0007':'郑九'}
dict_job_of_staff ={
'0001':'General Manager',
'0002':'R&D Director',
'0003':'Product&Marketing Director',
'0004':'Sales Director',
'0005':'Finacial Director',
'0006':'Office Director',
'0007':'Supply Chain Director'}
dict_salary_of_staff ={
'0001':'50000',
'0002':'40000',
'0003':'40000',
'0004':'45000',
'0005':'39000',
'0006':'20000',
'0007':'47000'}
dict_bonus_of_staff ={
'0001':'70000000',
'0002':'18000000',
'0003':'25000000',
'0004':'20000000',
'0005':'10000000',
'0006':'7000000',
'0007':'33000000'}
list_staff_num = []
dict_staff_num = {}
obtaining_staff_num(dict_name_of_staff,list_staff_num)
# print(list_staff_num)
create_staff_register(list_staff_num,dict_staff_num)
# print(dict_staff_num)
add_bonus_to_staff(dict_bonus_of_staff,dict_staff_num)
add_salary_to_staff(dict_salary_of_staff,dict_staff_num)
add_job_to_staff(dict_job_of_staff,dict_staff_num)
add_name_to_staff(dict_name_of_staff,dict_staff_num)
print(dict_staff_num)
if __name__ == '__main__':
main()
运行的结果,发现最后的 dict_staff_num 打印出现的信息,key从‘0001’~‘0007’正确,但是对应的value全部是['郑九','Supply Chain Director','47000','33000000']
在每一个函数中单步运行打印结果,发现每一步执行都会将上一步内容替换掉,而函数运行确实没有问题,逻辑上检查也没有发现问题。
百思不得其解后,突然意识到是问题出现在生成的空白dict时,将value全部置‘0’时,将每一个key对应的value都赋值 initial_list 时,出现的问题。
修改:
模块增加 import copy
然后将
for num in range(len(list_num)):
dict_num[list_num[num]] = initial_list
修改为:
for num in range(len(list_num)):
dict_num[list_num[num]] = copy.deepcopy(initial_list)
再运行代码,结果与预期一致

浙公网安备 33010602011771号