3 分钟阅读
字典合并:覆盖值与改变顺序是两件事
默认配置与用户配置合并时,右侧值通常应覆盖左侧值。若还要把结果按输入顺序展示,就需要知道覆盖已有键是否改变它的位置。
默认配置与用户配置合并时,右侧值通常应覆盖左侧值。若还要把结果按输入顺序展示,就需要知道覆盖已有键是否改变它的位置。
读取文本数字时,如果先转换再筛选,空字符串会在过滤之前触发异常。推导式简洁,但仍有明确的执行次序。
两列数据分别保存姓名和分数,zip 默认按较短的一列结束。尾部遗漏不会报错,因此一次字段缺失可能变成看似合法但不完整的结果。
使用 range(len(items)) 取得序号,再通过索引取元素,会把遍历写得较绕。处理日志行号时,还经常把零基索引和一基行号混为一谈。
复制二维列表后修改内部行,原数据也变了。问题不是 copy 失效,而是外层容器复制完成后,内部对象仍被两个容器共同引用。
把空列表写在函数签名里,看起来每次调用都会得到一个新列表。实际上连续两次追加后,第二次结果往往包含第一次的数据,测试之间也可能互相污染。
比较两种写法时,第一次运行可能受类加载、JIT 和缓存影响。墙上时钟还可能校正,直接相减并不适合精细耗时测量。
客户端超时后重试创建订单,即便每次生成的 UUID 都不同,系统仍可能创建重复订单。唯一性并没有解决同一次业务操作的识别问题。
把令牌或用户数据做 Base64 后放进 URL,不会让它成为秘密。任何拿到文本的人都可以执行反向解码。
用户传入 ../private.txt 时,简单字符串拼接可能访问预期目录之外的文件。规范化路径只是边界检查的一部分。
直接调用 Instant.now 的代码很难稳定测试边界时间,尤其是过期判断与跨日逻辑。让测试依赖真实时钟也会制造偶发失败。
生产者持续快于消费者时,无限增加队列只会把问题从处理速度转移到内存。缓冲需要上限,也需要满载行为。