2 回答

TA貢獻1804條經(jīng)驗 獲得超2個贊
關(guān)鍵在這里
ret.append(res)
res是一個dict object,而不是一個dict拷貝。它的值是會變的。如果想要得到[{'id':0},{'id':1},{'id':2}],應(yīng)該這樣:
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實例,值都是獨立的。

TA貢獻2039條經(jīng)驗 獲得超8個贊
你append的是同一字典對象
在python中l(wèi)ist, dict等是【可變】的數(shù)據(jù)類型
數(shù)據(jù)(對象)賦值視為引用命名
當(dāng)引用這些【可變】的數(shù)據(jù)進行【修改】操作時
相當(dāng)於對改變所有引用同一個數(shù)據(jù)的變量
看這個例子
>>> a = {} # a引用{}
>>> b = a # b引用a所引用的對象
>>> b[1] = 1 # 對b進行修改
>>> a
{1: 1} # 實際a也被修改了
>>>
你代碼中的res就相當(dāng)于a
append就相當(dāng)于用b引用a進行修改後,把b放到ret這個list後面
你可以這樣做
ret = []
for i in range(3):
res = {} # 重新賦值,而不是修改
res['id'] = i
ret.append(res) # 相當(dāng)于ret.append({'id': i})
print ret
或者更簡單點:
print [{'id': i} for i in range(3)]
添加回答
舉報