我想问为什么不是[{'id':0},{'id':1},{'id':2}]?

res = {}
ret = []
for i in range(3):
res['id']=i
ret.append(res)
print ret
结果是:
[{'id': 0}]
[{'id': 1}, {'id': 1}]
[{'id': 2}, {'id': 2}, {'id': 2}]
[{'id': 2}, {'id': 2}, {'id': 2}]

LEATH
浏览 352回答 2
2回答

慕婉清6462132

关键在这里ret.append(res)res是一个dict object,而不是一个dict拷贝。它的值是会变的。如果想要得到[{'id':0},{'id':1},{'id':2}],应该这样:ret = []for i in range(3):res = {}res['id']=iret.append(res)print ret或者(更简洁的):ret = []for i in range(3):ret.append({'id': i})print ret这样每次加入list的都是一个新的dict实例,值都是独立的。

largeQ

你append的是同一字典对象在python中list, dict等是【可变】的数据类型数据(对象)赋值视为引用命名当引用这些【可变】的数据进行【修改】操作时相当於对改变所有引用同一个数据的变量看这个例子>>> a = {} # a引用{}>>> b = a # b引用a所引用的对象>>> b[1] = 1 # 对b进行修改>>> a{1: 1} # 实际a也被修改了>>>你代码中的res就相当于aappend就相当于用b引用a进行修改後,把b放到ret这个list後面你可以这样做ret = []for i in range(3):res = {} # 重新赋值,而不是修改res['id'] = iret.append(res) # 相当于ret.append({'id': i})print ret或者更简单点:print [{'id': i} for i in range(3)]
打开App,查看更多内容
随时随地看视频慕课网APP