实例变量差异(Python)

instance variable difference (Python)

我对以下解决方案有 2 个问题。

下面是我对这道leetcode问题的回答(解法1):https://leetcode.com/problems/distribute-coins-in-binary-tree/

# Solution 1:
class Solution:
    def distributeCoins(self, root: TreeNode) -> int:
        self.ans = 0

        def dfs(node):
            if not node:
                return 0

            L, R = dfs(node.left), dfs(node.right)
            self.ans += abs(L) + abs(R)
            return node.val + L + R - 1

        dfs(root)
        return self.ans

问题 1 我想知道为什么下面的问题不起作用。解一和解二的变量ans有什么区别?

# Solution 2:
class Solution:
    def distributeCoins(self, root: TreeNode) -> int:
        ans = 0  
        self.dfs(root, ans)
        return ans
    
    def dfs(self, node, ans):
        if not node:
            return 0

        L, R = self.dfs(node.left, ans), self.dfs(node.right, ans)
        ans += abs(L) + abs(R)

        return node.val + L + R - 1

因为下面的 grid 变量(解决方案 3)的变化会累积并影响所有每个递归,我认为解决方案 2 也是如此。

问题2解法2的ans和解法3的grid有什么区别,使得递归的差异不累加? (以下是 https://leetcode.com/problems/number-of-islands/ 的解决方案)

# Solution 3:
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        if not grid:
            return 0

        count = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] == '1':
                    self.dfs(i, j, grid)
                    count += 1

        return count

    def dfs(self, i: int, j: int, grid: List[List[str]]):
        if i < 0 or j < 0 or i >= len(grid) or j >= len(grid[0]) or grid[i][j] != '1':
            return

        grid[i][j] = '#'

        self.dfs(i + 1, j, grid)
        self.dfs(i - 1, j, grid)
        self.dfs(i, j - 1, grid)
        self.dfs(i, j + 1, grid)

在解决方案 #2 中,您将整数 ans 传递给 dfs 函数,该函数可能会更改它,但调用者看不到此更改,因为整数是不可变的,因此修改后的 ans 是与原始对象无关的新对象 ans=0.

另一方面,解决方案#3,传递可变对象List。更改(变异)此对象 grid[i][j] = '#' 对持有(引用)此对象的任何范围都是可见的。

这与更改 self.ans 的解决方案 #1 相同,这又是所有递归范围中同一对象的相同属性。