Python: 为什么一个函数能够改变另一个函数中的数组?我想这是范围的问题

Python: Why is one function able to mutate an array in another function? I guess it's an issue of scope

我很困惑。我不明白如何通过在 DFS 中进行更改来在 numIslands 中更新 visited

我的理解是,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

The way I understood it was that visited, once passed into DFS, is like a copy of the original visited.

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

要真正让 DFSnumIslands 中独立于 visited 运行,您需要制作一个 deep-copy:

from copy import deepcopy

. . .

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

尽管这通常不是一个好主意,因为 deepcopy 是一个相当昂贵的函数,而且我认为无论如何您都不想在这里这样做。该算法要求 DFS 变异 visited。如果没有,DFS 不会做任何事情,因为它从来没有 returns 一个值。