深度拷贝与浅拷贝的一个案例----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)

再运行代码,结果与预期一致  

 

posted @ 2022-05-31 15:40  青萍微澜  阅读(44)  评论(0)    收藏  举报