为了账号安全,请及时绑定邮箱和手机立即绑定

您好,想要求一个append()函数的问题,具体请看下面

您好,想要求一个append()函数的问题,具体请看下面

慕娘9325324 2022-01-14 15:11:51
res = {}ret = []for i in range(3):res['id']=iret.append(res)print ret结果是:[{'id': 0}][{'id': 1}, {'id': 1}][{'id': 2}, {'id': 2}, {'id': 2}][{'id': 2}, {'id': 2}, {'id': 2}]我想问为什么不是[{'id':0},{'id':1},{'id':2}],
查看完整描述

2 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

关键在这里

ret.append(res)
res是一个dict object,而不是一个dict拷贝。它的值是会变的。如果想要得到[{'id':0},{'id':1},{'id':2}],应该这样:

ret = []
for i in range(3):
res = {}
res['id']=i
ret.append(res)
print ret

或者(更简洁的):

ret = []
for i in range(3):
ret.append({'id': i})
print ret

这样每次加入list的都是一个新的dict实例,值都是独立的。

查看完整回答
反对 回复 2022-01-17
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

你append的是同一字典对象
在python中list, dict等是【可变】的数据类型
数据(对象)赋值视为引用命名
当引用这些【可变】的数据进行【修改】操作时
相当於对改变所有引用同一个数据的变量
看这个例子
>>> a = {} # a引用{}
>>> b = a # b引用a所引用的对象
>>> b[1] = 1 # 对b进行修改
>>> a
{1: 1} # 实际a也被修改了
>>>
你代码中的res就相当于a
append就相当于用b引用a进行修改後,把b放到ret这个list後面

你可以这样做

ret = []

for i in range(3):
res = {} # 重新赋值,而不是修改
res['id'] = i
ret.append(res) # 相当于ret.append({'id': i})
print ret

或者更简单点:
print [{'id': i} for i in range(3)]



查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 390 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号