故障表现

用 set 给带顺序的 id 列表去重,结果输出顺序与原始顺序不一致,分页数据错位。

问题出在哪

set 基于哈希存储,不保证插入顺序,遍历顺序由哈希值决定。判断时先分清是 Python 列表去重保序 本身的配置问题,还是上游调用、运行环境带进来的差异;前者改配置就能收口,后者要沿着请求链路一层层往上找,处理顺序不能颠倒。先在出问题的机器上复现一次,把报错原文和发生时间记下来,再对着日志定位。

按这个顺序处理

  1. 改用 dict.fromkeys 保序去重
  2. 需要兼容旧版本时手动遍历判断
  3. 去重后确认元素数量正确

对应的命令或配置片段如下,可直接复制:

ids = [3, 1, 3, 2, 1]
uniq = list(dict.fromkeys(ids))
print(uniq)
print(uniq == [3, 1, 2])

不要一次改多个参数,每次只动一处并记录下来,否则现象变了也说不清是哪个改动起的作用。改完只在一台机器上验证不够,至少从外网和移动网络各试一次,才能确认不是本地缓存造成的假象。

怎么确认改好了

去重结果保持首次出现的顺序,数量与预期一致。

作者 9823189