在 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中文网其他相关文章!