Python 中的巢狀清單可變性混亂
簡介:
簡介:一個常見問題處理巢狀清單時出現。對子清單所做的變更會意外影響外部清單中的所有其他子清單。這種意外行為源自於清單創建和可變性的底層機制。
問題:xs = [[1] * 4] * 3
xs[0][0] = 5
不是僅更改第一個子清單的第一個元素,而是所有子清單的所有第一個元素都修改為5。
原因:理解這種行為的關鍵在於方式Python 將序列相乘。在現有清單 [x] 上使用 * 運算子時,它不會建立新清單。相反,它會創建對同一列表對象的多個引用。 因此,在代碼xs = [[1] * 4] * 3 中,表達式[1] * 4 被計算一次,並且計算了3 次對該單一列表的引用被分配給外部列表。這意味著所有子列表都是同一個物件。
解決方案:xs = [[1] * 4 for _ in range(3)]
在這種情況下,列表推導式每次迭代都會重新計算[1] * 4表達式,從而產生三個不同的結果
整數的不變性:需要注意的是,Python 中的整數是不可變的,這意味著它們的值不能更改。因此,即使 * 運算子建立對相同清單的多個引用,該清單中的整數值仍然不受影響。以上是為什麼修改巢狀 Python 清單中的子清單會影響所有子清單?的詳細內容。更多資訊請關注PHP中文網其他相關文章!