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
。
要真正让 DFS
在 numIslands
中独立于 visited
运行,您需要制作一个 deep-copy:
from copy import deepcopy
. . .
self.DFS(grid, deepcopy(visited), i, j)
尽管这通常不是一个好主意,因为 deepcopy
是一个相当昂贵的函数,而且我认为无论如何您都不想在这里这样做。该算法要求 DFS
变异 visited
。如果没有,DFS
不会做任何事情,因为它从来没有 returns 一个值。
我很困惑。我不明白如何通过在 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
。
要真正让 DFS
在 numIslands
中独立于 visited
运行,您需要制作一个 deep-copy:
from copy import deepcopy
. . .
self.DFS(grid, deepcopy(visited), i, j)
尽管这通常不是一个好主意,因为 deepcopy
是一个相当昂贵的函数,而且我认为无论如何您都不想在这里这样做。该算法要求 DFS
变异 visited
。如果没有,DFS
不会做任何事情,因为它从来没有 returns 一个值。