今天寫了這樣的一段代碼,出現了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)