亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

LEATH 2022-09-16 18:14:28
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}]
查看完整描述

2 回答

?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

關鍵在這里

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-09-21
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

你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-09-21
  • 2 回答
  • 0 關注
  • 375 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號