关于python用列表append字典数据却一直重复问题
- 用列表append添加字典数据却一直重复最后一个
- 理解了上面的内容之后,我们再回到最初的问题
- 解决方法
用列表append添加字典数据却一直重复最后一个
以下是我们的代码:
def parse_data(data):
parse_dict = dict()
parse_list = list()
for i in data:
parse_dict['标题'] = i['release_name'] if i['release_name'] else '空'
parse_list.append(parse_dict)
这段代码执行完后,最后并不是完整的解析数据,而是重复的数据。
上面是我提取自己项目的某一块进行修改,可能不好解释,应该是如以下的代码:
l = list()
d = dict()
for i in range(10):
d["num"] = i
l.append(d)
结果:
这个问题就是引用问题导致!
我们会以为是这样:
其实是这样:
其实我们定义每一个变量其实都是对内存地址中一个对象进行引用,对象就是内存中的一块数据。
举个例子:
a = 1
这段代码,Python 会在内存中创建一个数值为1的 int 类型的对象,变量 a 是一个到该对象内存地址的引用,如下图所示:
我们再来创建一个变量 b,让它等于 a
a = 1
b = a
print(id(a))
print(id(b))
输出结果:
之所以会这样,变量 b 其实存的也是一个引用,指向的是一个对象,这个对象就是 a 所指向的对象,所以 b 和 a 其实指向了同一个对象。
接下来我们改变一下 a 的值:
a = 2
print(id(a))
print(id(b))
输出结果:
看到 a 的地址发生了变化,而b却没有变。因为这里我们创建了一个新的对象,这个对象是一个数值为2的 int 类型对象,它的地址不同于上面创建的第一个对象(数值为1的 int 对象)。现在的 a 指向的是这个新的对象。
Python 中任何类型的对象,当它赋值给变量的时候,变量里存的都是引用。这也意味着,我们在读取变量的时候,实际读取的是变量所指向的对象的内容。
理解了上面的内容之后,我们再回到最初的问题
这个过程中,d始终指向同一个字典,只是字典中的值从0变化到了9。
所以每次循环中 , l.append(d) 都是把同一个对象的引用 append 到了 l 中。循环结束,l 就变成了这样
上面的 a(看成字典) 是同一个引用,指向的都是同一个对象。a 指向的地址一直没变,变化的是字典里的内容。
所以现在 l 的内容就是:
解决方法
解决方法就是把创建字典变量写到循环里面来:
l = list()
for i in range(10):
d = dict()
d["num"] = i
l.append(d)
结果: