python在递归方法中传递引用类型参数容易发生的错误

有的时候我们在递归方法中会传递一个列表类型的参数(引用类型参数),在进行递归操作的时候对传递的列表进行修改,如果在回溯的时候直接令变量名直接等于之前保存的列表副本来恢复现场的时候此时返回到上一层的时候列表其实是没有恢复现场的,其实左边一个变量名可以看成重新声明了一个变量,并没有恢复现场,所以并没有对方法中传递过来的变量进行修改,例如下面的a = t[:]就是一个错误的恢复现场的写法,返回到上一层的时候a是没有发生任何变化的:

from typing import List


class Solution:
    count = 0

    def dfs(self, a: List[int]):
        if self.count == 3: return
        self.count += 1
        t = a[:]
        a[:2] = [3, 4]
        self.dfs(a)
        a = t[:]
        print(a)

    def process(self):
        a = [1, 2, 3, 4, 5]
        self.dfs(a)
        print(a)


if __name__ == '__main__':
    print(Solution().process())

其中一种正确的恢复现场的写法,其实是解析器知道a这个变量属于方法中传递过来的引用类型的变量,这个时候回溯恢复现场就是正确的:

from typing import List


class Solution:
    count = 0

    def dfs(self, a: List[int]):
        if self.count == 3: return
        self.count += 1
        t = a[:]
        a[:2] = [3, 4]
        self.dfs(a)
        a[:] = t[:]
        # print(a)

    def process(self):
        a = [1, 2, 3, 4, 5]
        self.dfs(a)
        print(a)


if __name__ == '__main__':
    print(Solution().process())

Guess you like

Origin blog.csdn.net/qq_39445165/article/details/121859214