在一次爬虫实战中,需要将字典加入列表中,意外的情况出现了!!!下面简单分析一下出现的状况:
1 list = [] 2 dic = {} 3 for i in range(5): 4 dic['num'] = i 5 list.append(dic) 6 print(id(dic)) 7 print(list) 8 136652096 9 136652096 10 136652096 11 136652096 12 136652096 13 [{'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}, {'num': 4}]
结果出乎意料,并不是我们简单认为的
[{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}]
用我自己的理解是:
如上图,每一个dic都给list一个位置,但你的dic在循环外,也就说每次循环你给的都是一个地址,dic的值改变,新一次的循环值就会覆盖上一次循环的值,list取到的值也改变。
正确做法:
1 list = [] 2 for i in range(5): 3 dic = {} 4 dic['num'] = i 5 list.append(dic) 6 print(id(dic)) 7 print(list) 8 138383888 9 136652192 10 138383408 11 138384272 12 138383792 13 [{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}]
正确做法是将dic放入循环内,这样每次循环都会是一个新的dic,分配不同的地址。