python - 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
解决方案
我理解的方式是,访问过的,一旦传入 DFS,就像是原始访问过的副本。
这不是真的。Python 从不为您制作隐式副本。如果将对象传递给函数,则不会生成它的副本。您只是在函数范围内给与visited
第二个名称关联的对象。visited
要真正DFS
独立于visited
in操作numIslands
,您需要进行深层复制:
from copy import deepcopy
. . .
self.DFS(grid, deepcopy(visited), i, j)
尽管这通常不是一个好主意,因为deepcopy
它是一个相当昂贵的功能,而且我认为您无论如何都不想在这里这样做。该算法需要DFS
mutate visited
。如果没有,DFS
则不会做任何事情,因为它从不返回值。
推荐阅读
- java - 将项目添加到arraylist 不会添加它?
- apache-camel - Camel SNS - 如何在不阻塞的情况下使用异步客户端?
- python - 检查完成是否是 Jedi 0.14.0 中的 @property
- powershell - Powershell查询多台计算机的公共IP地址不起作用
- image - Show svg hosted by a local server in Google Sheets
- r - 使用分隔符查找所有可能的长度为 n 的子字符串
- r - if (lastnote[i] < 50) { 中的错误:需要 TRUE/FALSE 的缺失值
- java - CPU 日志解析、分组和报告
- vba - 如何在 vb.net-application 上运行 visio-macro?
- python - 提高 antlr 性能