为何列表中已添加的PLCdevice数据会随计算改变?
问题原因分析
你遇到的问题核心是:Python中的字典是可变对象,列表中存储的不是字典的独立副本,而是指向原字典的引用。
你的代码里,PLCdevice是全局唯一的字典实例。每次调用PLCcal函数时,都是直接修改这个全局字典的内容,再返回它的引用。当你把函数返回值添加到PLCList时,列表里的每个元素其实都是指向同一个PLCdevice字典的指针。后续调用函数修改字典内容时,所有列表里的引用都会同步看到这个变化,导致之前存入的数据也跟着改变。
解决方案
提供两种简单有效的修改方式:
方法1:在函数内部创建新字典
把字典的定义移到函数内部,每次调用函数都会生成全新的字典实例,避免全局共享同一个对象:
PLCList = [] def PLCcal(DIneed ): # 每次调用都创建新的字典实例 PLCdevice = { '32DI': 0, '16DI': 0, '8DI': 0 } DIteklif = 12 DItoplam = 0 for i in range(0, 320, 8): DIyedek = DIteklif - DIneed DIoran = DIyedek / DIneed if DIoran > 0.26: break DIteklif = DIteklif + 8 DIteklif = DIteklif -12 DIteklif = DIteklif / 8 if DIteklif / 4 >= 1 : x = DIteklif / 4 PLCdevice['32DI'] = int(x) DIteklif = DIteklif - (int(x)*4) if DIteklif / 2 >= 1 : x = DIteklif / 2 PLCdevice['16DI'] = int(x) DIteklif = DIteklif - (int(x)*2) if DIteklif == 1 : x = DIteklif / 1 PLCdevice['8DI'] = int(x) DIteklif = DIteklif - (int(x)*1) return PLCdevice PLCList.append(PLCcal(32)) PLCList.append(PLCcal(85)) PLCList.append(PLCcal(411)) print(PLCList)
方法2:返回字典的副本
如果需要保留全局的字典模板,可以在返回时通过copy()方法生成字典副本,确保每次存入列表的都是独立对象:
# 全局定义模板字典 PLCdevice_template = { '32DI': 0, '16DI': 0, '8DI': 0 } PLCList = [] def PLCcal(DIneed ): # 复制模板字典,生成新实例 PLCdevice = PLCdevice_template.copy() DIteklif = 12 DItoplam = 0 for i in range(0, 320, 8): DIyedek = DIteklif - DIneed DIoran = DIyedek / DIneed if DIoran > 0.26: break DIteklif = DIteklif + 8 DIteklif = DIteklif -12 DIteklif = DIteklif / 8 if DIteklif / 4 >= 1 : x = DIteklif / 4 PLCdevice['32DI'] = int(x) DIteklif = DIteklif - (int(x)*4) if DIteklif / 2 >= 1 : x = DIteklif / 2 PLCdevice['16DI'] = int(x) DIteklif = DIteklif - (int(x)*2) if DIteklif == 1 : x = DIteklif / 1 PLCdevice['8DI'] = int(x) DIteklif = DIteklif - (int(x)*1) return PLCdevice
内容的提问来源于stack exchange,提问作者Oğuzhan Korkmaz
相关产品推荐
相关产品推荐

