為什麼在 Python 中修改巢狀清單會導致意外結果?

Patricia Arquette
發布: 2024-10-30 04:12:02
原創
550 人瀏覽過

Why Does Modifying a Nested List in Python Lead to Unexpected Results?

重訪巢狀清單索引

在 Python 中,巢狀清單提供了組織資料的便捷方式。然而,使用這些清單的索引有時會導致意外的結果。讓我們透過特定的程式碼範例探討與巢狀列表索引相關的常見問題:

考慮以下程式碼片段:

<code class="python">some_list = 4 * [(4 * [0])]
for i in range(3):
    for j in range(3):
        some_list[i+1][j+1] = 1
for i in range(4):
    print(some_list[i])</code>
登入後複製

預期目標是建立一個2D 列表,其中值位於每個索引(不包括第一行和第一列)都設定為1。但是,程式碼未能實現此目的。相反,它會產生一個列表,其中所有行和列都填充 1。

說明:

此問題的根本原因在於 Python 傳遞清單的方法參考。與基本值類型不同,列表會作為對相同記憶體位置的參考傳遞。這意味著對一個列表變數所做的任何更改都將反映在引用同一列表的所有其他變數中。

在給定的程式碼中,行 some_list = 4 * [(4 * [0])] 乘以列表四次包含單一 0 值。但是,它不會創建四個不同的清單。相反,它會建立一個列表,其中有四個引用指向相同的 0 值。

因此,當程式碼在循環的第一次迭代中更新 [i 1][j 1] 處的值時,它會修改所有其他引用指向的值。這解釋了為什麼所有元素最終的值為 1。

解決方案:

要解決此問題並創建四個不同的列表,每個列表都有自己的一組值,有必要避免第二次乘法。一種方法是使用循環分別初始化列表的每一行:

<code class="python">some_list = [(4 * [0]) for _ in range(4)]</code>
登入後複製

透過循環 range(4),此程式碼建立四個不同的列表,每個列表都有一組單獨的值。因此,後續對清單值的修改不會影響其他行。

以上是為什麼在 Python 中修改巢狀清單會導致意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!