You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止函数内修改二维列表时影响外部原列表?

问题解答

为什么修改函数内的二维列表会影响外部原列表?

Python中,列表属于可变对象,函数传递参数时,传递的是对象的内存引用,而非新的副本。对于二维列表来说,外层列表存储的是每个子列表的引用,当你在函数中修改lst2[0][2]时,实际是通过引用直接操作原列表中子列表的元素,因此外部原列表会同步被修改。

而整数、字符串这类不可变对象,在函数中修改时会创建新对象,不会影响外部变量,这就是两者的核心区别。

更优雅高效的解决方案

针对大矩阵场景,推荐以下几种方案:

1. 用列表推导式做浅拷贝(最优)

列表推导式是Python中高效创建列表的方式,比手动循环append更简洁且性能更优,适合子元素为不可变类型的二维列表:

def function(lst):
    # 内部创建原列表的浅拷贝
    lst_copy = [row[:] for row in lst]
    lst_copy[0][2] += 5
    print(lst_copy)
    return lst_copy

lst1 = [[9, 6, 4], [6, 8, 3]]
function(lst1)
print(lst1)  # 输出原列表:[[9, 6, 4], [6, 8, 3]]

2. 使用copy模块的deepcopy(适用于嵌套可变对象)

如果二维列表中还嵌套了其他可变对象(比如子列表里还有列表),浅拷贝无法完全隔离修改,这时可以用copy.deepcopy做深度拷贝:

import copy

def function(lst):
    lst_copy = copy.deepcopy(lst)
    lst_copy[0][2] += 5
    print(lst_copy)
    return lst_copy

lst1 = [[9, 6, 4], [6, 8, 3]]
function(lst1)
print(lst1)

注意:deepcopy性能比浅拷贝低,仅在需要深度隔离时使用。

3. 调用函数时直接传递拷贝后的列表

如果希望函数保持原有逻辑,也可以在调用时直接用列表推导式生成拷贝:

def function(lst3):
    lst3[0][2] += 5
    print(lst3)

lst1 = [[9, 6, 4], [6, 8, 3]]
function([row[:] for row in lst1])
print(lst1)

内容的提问来源于stack exchange,提问作者Dr_Claymore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:22:17