
本文介绍如何将包含单个字典的列表,通过编程方式高效复制扩展为指定数量的重复字典项,避免索引越界错误,并生成符合预期结构的 json 可序列化列表。
在实际开发中(尤其是构建测试数据、初始化配置或批量生成响应结构时),我们常需将一个基础字典项(如 { "text": "Hi.", "feedback": "", "_score": 0 })复制多次,填充到 _items 列表中,形成长度为 n 的同构列表。直接在循环中反复调用 json.dump() 并不能修改原始列表结构——它只是重复写入同一份数据到文件,且若未正确操作 data["_items"],极易引发 IndexError: list index out of range。
正确的做法是先扩展内存中的列表对象,再统一序列化。推荐使用简洁、高效且 Pythonic 的方式:列表推导式 + 重复解包。
假设原始数据结构如下:
data = {
"_items": [
{
"text": "Hi.",
"feedback": "",
"_score": 0
}
]
}要将 _items 扩展为 5 个完全相同的字典项,可执行:
n = 5 base_item = data["_items"][0] # 安全提取模板字典 data["_items"] = [base_item.copy() for _ in range(n)]
✅ 使用 .copy() 是关键:确保每个字典都是独立对象,避免后续修改时出现意外的引用共享问题(如修改第 2 项的 "text" 导致所有项同步变更)。
你也可以一步到位,不依赖原列表索引(更健壮):
# 若仅需生成新列表(不复用原 data 结构)
template = {"text": "Hi.", "feedback": "", "_score": 0}
_items = [template.copy() for _ in range(5)]
data = {"_items": _items}⚠️ 注意事项:
- ❌ 避免 data["_items"] *= n:虽然语法简洁,但会创建浅拷贝引用,所有元素指向同一字典对象;
- ❌ 不要在 for 循环中对 data["_items"] 做 append() 同时又误用 range(len(...)) 迭代原长度,易逻辑错乱;
- ✅ 扩展完成后,再调用 json.dump(data, file, indent=4) 一次即可,无需在循环内重复写入。
最终验证输出结构:
{
"_items": [
{"text": "Hi.", "feedback": "", "_score": 0},
{"text": "Hi.", "feedback": "", "_score": 0},
{"text": "Hi.", "feedback": "", "_score": 0},
{"text": "Hi.", "feedback": "", "_score": 0},
{"text": "Hi.", "feedback": "", "_score": 0}
]
}该方法时间复杂度 O(n),内存友好,语义清晰,适用于任何需要“模板实例化”的场景。









