Python中如何避免变量传引用导致原对象被意外修改
Python可变对象引用修改问题解决方案
问题本质
Python中列表、字典等属于可变对象,直接赋值时只是将新变量指向原对象的内存地址,并没有生成新的独立对象,因此对新变量执行修改操作时会同步作用到原对象上,属于Python的原生语法特性。
你之前的尝试中,lastRow = output[i - 1]、test = output[i - 1]都属于引用赋值,新增类变量也没有改变子列表共用内存地址的情况,因此问题依旧存在。
解决方案
根据对象嵌套层级选择对应的拷贝方式即可:
单层嵌套(你的杨辉三角场景适用)
子列表没有更深的嵌套结构,使用浅拷贝即可生成独立的新对象,可选实现方式如下:
- 切片语法:
lastRow = output[i - 1][:] - list构造函数:
lastRow = list(output[i - 1]) - copy模块浅拷贝:
import copy lastRow = copy.copy(output[i - 1])
多层嵌套
如果是嵌套层级≥2的复杂列表(比如[[1,2], [3, [4,5]]]),浅拷贝只会复制最外层结构,内层子对象依旧共用引用,需要使用深拷贝实现完全独立:
import copy lastRow = copy.deepcopy(output[i - 1])
深拷贝会递归复制所有层级的可变对象,修改新对象完全不会影响原对象。
修改后的代码示例
from typing import List class Solution: def generate(self, numRows: int) -> List[List[int]]: output = [] output.append([1]) for i in range(1, numRows): # 新增浅拷贝逻辑,不修改原output中的子列表 lastRow = output[i - 1][:] loop = len(lastRow) first = 0 second = lastRow.pop(0) temp = [] for x in range(loop): temp.append(first + second) if len(lastRow) > 1: first = second second = lastRow.pop(0) elif len(lastRow) == 1: first = second second = lastRow.pop(0) elif len(lastRow) == 0: temp.append(second + 0) break output.append(temp) return output
修改后输出为标准杨辉三角结构,原列表的子列表不会被pop操作清空。
内容的提问来源于stack exchange,提问作者Mahin
相关产品推荐
相关产品推荐

