遇到一個(gè)小問(wèn)題,在for循環(huán)中,將字典內(nèi)容追加到列表中時(shí)發(fā)現(xiàn)被覆蓋,在這里記錄一下~
list1=[]
use_dict=dict()
for i in range(3):
use_dict['num']=i
list1.append(use_dict)
print(list1)
在這里輸出的是:
[{'num': 2}, {'num': 2}, {'num': 2}]
將代碼修改之后:
for j in range(3):
use_dict2=dict()
use_dict2['num']=j
list2.append(use_dict2)
print(list2)
輸出的是:
[{'num': 0}, {'num': 1}, {'num': 2}]
造成這種結(jié)果的原因是:字典被append給列表的是一個(gè)地址,當(dāng)字典聲明在循環(huán)外的時(shí)候,字典始終是第一次聲明的那一個(gè),就算一直在追加值,也只不過(guò)是將新的值覆蓋掉原來(lái)的值而已;當(dāng)字典聲明在循環(huán)內(nèi)時(shí),每次循環(huán)都會(huì)生成一個(gè)新的字典,每次的值也就相應(yīng)的保存在了新的字典內(nèi).
打印其id可以很明確的看出來(lái):
list1=[]
use_dict=dict()
for i in range(3):
print(id(use_dict))
use_dict['num']=i
list1.append(use_dict)
print(list1)
list2=[]
for j in range(3):
use_dict2=dict()
print(id(use_dict2))
use_dict2['num']=j
list2.append(use_dict2)
print(list2)
輸出的結(jié)果為:
459391538888
459391538888
459391538888
[{'num': 2}, {'num': 2}, {'num': 2}]
459391539016
459391538952
459391539080
[{'num': 0}, {'num': 1}, {'num': 2}]