首页 > 解决方案 > Python:为什么一个函数能够改变另一个函数中的数组?我想这是范围的问题

问题描述

我很困惑。我不明白如何visited通过numIslands更改DFS.

我的理解是visited,一旦传入DFS,就像是原件的复制品visited

不是这样吗?

class Solution:
    def DFS(self, grid, visited, i, j):
        if i < 0 or j < 0 or i >= len(grid) or j >= len(grid[0]) or visited[i][j] or grid[i][j] == '0':
            return
        visited[i][j] = True
        self.DFS(grid, visited, i+1, j)
        self.DFS(grid, visited, i-1, j)
        self.DFS(grid, visited, i, j+1)
        self.DFS(grid, visited, i, j-1)
        
    def numIslands(self, grid: List[List[str]]) -> int:
        if not grid: return 0
        visited = [[False for i in range(len(grid[0]))] for j in range(len(grid))]
        count = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] == '1' and visited[i][j] == False:
                    self.DFS(grid, visited, i, j) # TODO
                    count += 1
        return count

标签: pythonpython-3.xscope

解决方案


我理解的方式是,访问过的,一旦传入 DFS,就像是原始访问过的副本。

这不是真的。Python 从不为您制作隐式副本。如果将对象传递给函数,则不会生成它的副本。您只是在函数范围内给与visited第二个名称关联的对象。visited

要真正DFS独立于visitedin操作numIslands,您需要进行深层复制:

from copy import deepcopy

. . .

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

尽管这通常不是一个好主意,因为deepcopy它是一个相当昂贵的功能,而且我认为您无论如何都不想在这里这样做。该算法需要DFSmutate visited。如果没有,DFS则不会做任何事情,因为它从不返回值。


推荐阅读