在 Python 中,當函數接收列表作為參數時,該參數實際上成為指向原始列表位置的引用記憶中。函數內對清單所做的任何修改都會直接反映在呼叫清單中。
但是,以下程式碼示範了挑戰這種理解的特殊行為:
<code class="python">def function1(list_arg): a = function2() # function2 returns an array of numbers list_arg = list(a) list1 = [0] * 5 function1(list1) print(list1) # [0, 0, 0, 0, 0]</code>
在此範例中,我們打算讓function1 修改list1,用陣列a 中的元素取代它的元素。但結果顯示list1沒有變化。為什麼會發生這種情況?
問題是由於錯誤的假設而產生的,即為 function1 中的 list_arg 變數分配新值會修改原始列表。實際上,此賦值僅更改 list_arg 的參考以指向記憶體中的不同物件。呼叫程式碼引用的原始列表保持不變。
要成功更改 function1 中的原始列表,我們需要修改其各個元素。這可以透過切片賦值來完成:
<code class="python">list_arg[:] = list(a)</code>
切片賦值將 list_arg 中的整個元素範圍替換為 list(a) 中的值。實際上,此操作直接修改了原始清單。
雖然切片分配提供了一種方便的解決方案,但重要的是要注意它潛在的混亂。透過就地修改列表,程式碼會變得不太透明,並且更容易受到維護它的其他開發人員的誤解。考慮替代方法,例如從函數傳回新的修改列表,以增強程式碼的清晰度和可讀性。
以上是為什麼在 Python 中將新列表指派給函數參數不會修改原始列表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!