1

我正在编写如下的置换函数,我感到困惑的是,如果我们返回“res.append(nums[:])”,它可以完美运行,但是如果我们只返回“res.append(nums)”,它'只会返回原始的 nums 值,而不是在我操作后存储新的 nums ......但不确定它背后的理论,有人可以解释一下吗?谢谢!


https://leetcode.com/problems/permutations/

class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        if len(nums)==0:
            return [[]]
        res=[]
    
    
        def get_permute(n):
            if n==0:
                res.append(nums[:]) ##<----here if we do res.append(nums) it'll be wrong, but why?
                return
            for i in range(n+1):
                nums[i], nums[n]=nums[n], nums[i]
                get_permute(n-1)
                nums[n], nums[i]=nums[i], nums[n]
    
        get_permute(len(nums)-1)
        return res
4

2 回答 2

4

当您获取列表的一部分时(即使它是整个列表, ie [:]),也会创建一个新列表。

因此,如果您res.append(nums)添加了对原始nums列表的引用,并且如果nums将来发生更改,那么您将在res.

当您这样做时,res.append(nums[:])您正在拍摄当前内容的快照并将其附加到nums-现在res即使nums稍后更改,res也不会。

于 2020-06-21T00:26:46.627 回答
1

不久:

nums[:]创建 nums 的副本。所以:res.append(nums[:])你确定,res即使稍后修改,通过迭代可以访问的内容也不会改变nums

看看下面的小例子:

nums = [1, 2, 3]
res = []
res.append(nums)
res.append(nums[:])
print(res)
nums.append(4)
print(res)

输出将是

[[1, 2, 3], [1, 2, 3]]
[[1, 2, 3, 4], [1, 2, 3]]
于 2020-06-21T00:30:21.797 回答