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
相关产品推荐
相关产品推荐

