关于python用列表循环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)

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨菲马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值