巢狀清單突變:了解意外行為
在Python 中,可變資料結構(例如清單)在巢狀時可能會出現意外行為。考慮建立清單清單的範例:
xs = [[1] * 4] * 3
這會初始化一個巢狀清單結構,其中每個子清單包含四個設定為 1 的元素。但是,修改這些最裡面的值之一,如下所示:
xs[0][0] = 5
影響每個子列表的所有第一個元素,結果位於:
[[5, 1, 1, 1], [5, 1, 1, 1], [5, 1, 1, 1]]
意外行為的原因
問題的根源在於* 運算子應用於物件時的工作方式。在本例中,行:
[[1] * 4] * 3
建立對同一子清單 [1] 4 的三個引用,而不是建立三個獨立的副本。這是因為 對表達式 [1] * 4 的求值結果進行運算,該結果是單一子清單。因此,對此單一子清單的任何變更都會反映在所有引用中。
解決問題
要建立獨立的子列表,有必要強制對[1] * 每個子列表有 4 個表達式。這可以使用列表理解來實現,如下所示:
[[1]*4 for _ in range(3)]
在這種情況下,每次都會評估[1]*4 表達式,從而創建三個不同的子列表以及任何更改到一個子列表只會影響該子列表,而不影響其他子列表。
以上是為什麼在 Python 中修改巢狀清單會意外影響所有子清單?的詳細內容。更多資訊請關注PHP中文網其他相關文章!