直接上代码
有 bug 的情况
aaa = [
{'id': 35,'src':'xxx'},
{'id': 36,'src':'xxx'},
{'id': 37,'src':'xxx'},
{'id': 38,'src':'xxx'},
]
combinations = []
for i in range(5):
cname = f'张三-{i}'
ccc = random.choice(aaa)
ccc.update({'cname': cname})
print(ccc) # 这里的结果符合预期
combinations.append(ccc)
print(combinations) # 但是这里就错了
返回结果
{'id': 37, 'src': 'xxx', 'cname': '张三-0'}
{'id': 38, 'src': 'xxx', 'cname': '张三-1'}
{'id': 35, 'src': 'xxx', 'cname': '张三-2'}
{'id': 38, 'src': 'xxx', 'cname': '张三-3'}
{'id': 36, 'src': 'xxx', 'cname': '张三-4'}
# 以上 print 结果是对的
[{'id': 37, 'src': 'xxx', 'cname': '张三-0'}, {'id': 38, 'src': 'xxx', 'cname': '张三-3'}, {'id': 35, 'src': 'xxx', 'cname': '张三-2'}, {'id': 38, 'src': 'xxx', 'cname': '张三-3'}, {'id': 36, 'src': 'xxx', 'cname': '张三-4'}]
# 但是这里打印新生成的 combinations 列表就出现两个 `张三-3`
改代码
后来想起来是引用对象问题,需要浅复制下.即只需要将 ccc = random.choice(aaa)改为ccc = random.choice(aaa).copy() 就符合预期了.
bug 的疑问
bug 问题在于示例里,单个 print 结果和添加到列表里的结果不一致.
python 版本 3.10.8