You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何列表中已添加的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:30:42