python列表范围跨递归调用

时间:2018-05-03 17:22:02

标签: python python-3.x list

我在python3中编写了一个递归置换生成器:

    def permute(self, nums):
    """
    :type nums: List[int]
    :rtype: List[List[int]]
    """

    ret = []
    n = len(nums)
    def dfs(temp, visited):
        if len(temp) == n:
            ret.append(temp[:])
            return
        for i in range(n):
            if not visited[i]:
                visited[i] = True
                temp.append(nums[i])
                dfs(temp, visited)
                # Cannot be:
                # temp = temp[:-1]
                del temp[-1]
                visited[i] = False
    dfs([], [False for _ in range(n)])                            
    return ret

我最初在递归的dfs返回后使用temp = temp[:-1],但这似乎不起作用。明确使用del temp[-1]工作。

我无法弄清楚为什么会这样,反正请解释一下?

1 个答案:

答案 0 :(得分:2)

在函数内部分配局部变量对外界没有影响:

def foo(lst):
    lst = [1, 2, 3]

L = [1]
foo(L)
print(L)  # still [1]

修改传入的变量:

def foo(lst):
    lst.append(4)

L = [1]
foo(L)
print(L)  # [1, 4]

在您的情况下,del temp[-1]会更改传递的列表。在您的代码中,只有一个分配给temp的列表,其开头为[]temp = temp[:-1]创建一个新的独立列表。