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

Python后续代码修改已append的日志条目原因及解决方法

问题原因

核心是对Python可变对象的引用传递机制存在认知偏差:

  • Python中的字典属于可变对象,变量存储的是对象的内存引用,而非对象本身的独立副本
  • 执行patient.log.append(entry)时,只是将entry的内存引用存入了列表,没有生成新的字典对象
  • 后续给entry新增patient_id字段时,修改的是内存中同一个字典对象,因此patient.log中存储的引用指向的内容也会同步更新,并不是“后续代码影响了已执行完成的前序代码”,只是前后操作的是同一个对象而已。

修复方案

要实现patient.log和ALL_PATIENT_LOG的日志条目独立,只需要在存储时生成独立的字典副本即可,两种常用修改方式:

方式1:存入全局日志时创建副本

修改新增的代码段,给全局日志单独生成副本,不影响原本的entry对象:

def update(patient, attribute, argument, replace = False):
    now = datetime.now()
    entry = {"argument": argument, "attribute": attribute, "time": now.strftime("%H:%M on %d/%m/%y")}
    patient.log.append(entry)
    # 修改新增的代码段
    global_log_entry = entry.copy()
    global_log_entry["patient_id"] = patient.id
    ALL_PATIENT_LOG.append(global_log_entry)
    if replace:
        patient.__dict__[attribute] = [argument]
    else:    
        patient.__dict__[attribute].append(argument)

方式2:存入患者日志时创建副本

如果后续还会对entry做多次修改,也可以在存入患者日志时就生成独立副本:

patient.log.append(entry.copy())

如果你的entry字典后续会包含嵌套的可变对象,可以使用copy模块的deepcopy方法生成完全独立的深拷贝。

内容的提问来源于stack exchange,提问作者John Salter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:24:04