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

Python for循环中sum变量仅存储最后一个值的问题如何解决?

问题根因
  • 核心错误是累加变量的初始化位置错误:你将sum = 0写在了for record in records:循环内部,每次遍历新的product_id对应记录时都会把sum重置为0,最终sum只会保留最后一个record对应的所有record1的累加结果,无法实现全量数据累加。
  • 额外存在两个不规范问题:直接拼接SQL语句存在SQL注入风险;使用Python内置函数sum作为变量名会覆盖原有内置功能,不推荐使用。
修复方案

方案1:仅调整累加变量初始化位置(最小改动)

把sum的初始化语句移到所有循环外层即可,同时替换变量名避免覆盖内置函数,修改后代码如下:

# 累加变量初始化放在最外层,避免每次循环被重置
total = 0
# 改用参数化查询避免SQL注入风险
query = "SELECT product_id FROM product_orders WHERE table_number = %s"
cursor.execute(query, (e,))
records = cursor.fetchall()
for record in records:
    query2 = "SELECT * FROM productss WHERE id = %s"
    cursor.execute(query2, (record[0],))
    record2 = cursor.fetchall()
    for record1 in record2:
        total = total + record1[2]
        tree.insert("", tk.END, values=record1)

tree2.insert("", tk.END, values=total)

方案2:优化SQL逻辑(性能更优)

直接通过SQL关联查询一次性拿到所有需要的明细数据,也可以直接在SQL中完成总和计算,减少数据库查询次数和Python层循环逻辑:

# 关联查询直接拿到所有需要的明细,同时用开窗函数计算全局总和
query = """
SELECT p.*, SUM(p.你要累加的字段名) OVER() AS total_sum
FROM product_orders po
INNER JOIN productss p ON po.product_id = p.id
WHERE po.table_number = %s
"""
cursor.execute(query, (e,))
all_data = cursor.fetchall()
total = 0
if all_data:
    # 所有行的最后一列都是全局总和,取第一行的最后一列即可
    total = all_data[0][-1]
    for row in all_data:
        # 插入明细时去掉最后一列的总和字段
        tree.insert("", tk.END, values=row[:-1])

tree2.insert("", tk.END, values=total)

内容的提问来源于stack exchange,提问作者Osama Ashour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:24:04