[Python]list.append字典的時候,修改字典會導致list內容變化的問題


今天寫了這樣的一段代碼,出現了BUG。

log_message["EventName"] = "上架->可用"
log_message["EventNum"] = all_diff
event_log.append(log_message)

log_message["EventName"] = "可用->停用"
log_message["EventNum"] = stop_diff
event_log.append(log_message)

 BUG表現為,第二條log_message在event_log中出現了兩次,第一條message則不見了。

網上可以找到一樣的問題:[Python]list.append()在for循環中每次添加的都是最后的一個元素

主要原因是dict是一個可變的對象,list在append的時候,只是append了對象的引用,沒有append對象的數據。修改了對象之后,之前append過的對象也會發生變化。

之前雖然知道dict可變,但以為是append之后,list會將數據固定下來,不再讓其可變。事實證明list append的只是對象的引用。這樣的思路其實也對,因為這樣設計會節省內存。

 

要解決這個問題, 一是向list中插入不可變對象,如將dict變為tuple類型。

另外就是每次都插入一個新的對象,而不是對象的引用。如 event_log.append(log_message1),  event_log.append(log_message2).

完全重新聲明一個log_message2對我來說有點麻煩,log_message的其他字段初始化有點繁瑣。

所以我選擇復制一個。復制的話依然需要小心引用的問題,有關拷貝對象可以參考這個:Python 拷貝對象(深拷貝deepcopy與淺拷貝copy)

import copy

log_message["EventName"] = "上架->可用"
log_message["EventNum"] = all_diff
event_log.append(log_message)

log_message2 = copy.deepcopy(log_message)
log_message2["EventName"] = "可用->停用"
log_message2["EventNum"] = stop_diff
event_log.append(log_message2)

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM