Python中如何通过for循环将person字典的完整值存入all字典?
问题原因与解决方法
问题根源
你遇到的问题是因为可变对象的引用特性:循环中复用了同一个person字典和N列表,每次循环结束调用clear()时,会把已经存入all字典里的对象也清空——因为all[j] = person存的是字典的引用,不是独立的副本,修改原对象会同步影响all里的内容。
解决方法一:每次循环创建新对象(推荐)
直接在循环内部新建person字典和N列表,避免复用同一个对象:
from random import * from PIL import Image import numpy as np import FCM as FCM from collections import defaultdict ii = Image.open("dataset/image11.jpg").convert("L") data = list(ii.getdata()) all = {} for j in range(8): N = [] # 每次循环新建空列表 for i in range(4): N.append(randint(min(data), max(data))) person = {} # 每次循环新建空字典 person['cluster'] = N person['obj'] = FCM.objfunc(FCM.rlistes(data, person['cluster']), person['cluster']) all[j] = person print(all)
解决方法二:存入字典时保存副本
如果一定要复用外部定义的person和N,可以在存入all时创建对象的副本,避免后续修改影响已存入的内容:
from random import * from PIL import Image import numpy as np import FCM as FCM from collections import defaultdict ii = Image.open("dataset/image11.jpg").convert("L") data = list(ii.getdata()) person = {} N = [] all = {} for j in range(8): N.clear() for i in range(4): N.append(randint(min(data), max(data))) person['cluster'] = N.copy() # 保存列表的副本 person['obj'] = FCM.objfunc(FCM.rlistes(data, person['cluster']), person['cluster']) all[j] = person.copy() # 保存字典的副本 person.clear() print(all)
内容的提问来源于stack exchange,提问作者saida dz
相关产品推荐
相关产品推荐

