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

Python中为何函数可在另一函数修改数组?DFS修改visited的困惑

为啥DFS里改了visited数组,numIslands里的原数组也跟着变?

哈哈,这个问题我刚学Python的时候也踩过一模一样的坑!核心原因就是Python里的列表(包括你用的二维列表)是按「引用」传递的,不是按「值」传递——你以为传进去的是副本,其实传的是指向原数组的“内存地址”。

给你掰扯明白底层逻辑:

你在numIslands里初始化的visited = [[False for i in range(len(grid[0]))] for j in range(len(grid))],是一块实实在在存在内存里的二维数组。当你把它作为参数传给DFS函数时,并没有复制一份新数组给DFS,只是告诉DFS:“你要操作的数组就在内存这个位置,直接用就行”。

换句话说,DFS里的visited参数和numIslands里的visited变量,本质上是同一个数组的两个“别名”而已。你在DFS里执行visited[i][j] = True,就等于直接在原数组上修改内容,numIslands里自然能同步看到变化。

举个极简小例子直观验证:

def modify_array(arr):
    arr[0] = "我被修改啦!"

my_arr = ["初始内容"]
modify_array(my_arr)
print(my_arr)  # 输出:["我被修改啦!"]

看,函数里改的就是原数组,和你的岛屿统计代码逻辑完全一致。

要是真需要传递副本怎么办?

如果你确实需要在函数里操作副本而不影响原数组,得手动做深拷贝,比如调用DFS的时候改成这样:

import copy
self.DFS(grid, copy.deepcopy(visited), i, j)

不过回到你的岛屿数量问题,咱们恰恰需要共享这个visited数组——不然递归遍历的时候没法统一记录哪些单元格已经被访问过,统计岛屿数量就会重复计算,结果肯定出错。所以你现在的写法其实是完全正确且高效的,不用改~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:32:52