首先,不用解釋器,腦補一下下面這段代碼的結果是什麼

有沒有娃兒和我一樣覺得是[0,1,0]的?

實際上結果出人意料地是[1,1,0]

WTF!昨天晚上我想了三宿都沒明白Σ(`д′*ノ)ノ 後來吃了一個橙子終於想通了

a=[[0]*3]*3這句話來將a賦值成 [[0,0,0],[0,0,0],[0,0,0]],然而python似乎是這樣賦值的:

list mem allocation

為了驗證這個猜想我們用內置函數id來打印內存地址(僅對cpython而言

這證明了我們的猜想。

那麼如果我用下面這句話來初始化a呢?

這次直接看id:

不一樣了吧。可見使用列表推導式時,每次都會重新計算一次[0,0,0]的值(在這個例子中它不隨i變化),而不會去引用之前的結果;或者說,*運算符作用於列表時產生n個對原對象的引用,而不是真正的複製

還有個有趣的現象

真特么摳門,真不知道cpython的內存回收是怎麼做的,有空去看看源碼(* ̄︶ ̄)y