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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:54:03