array[:]在这个回溯算法中,或者更确切地说在Python中到底做了什么



所以,我正在解决(或者更确切地说,查看解决方案哈哈(Leetcode上的一个问题,这是一个允许您生成具有唯一整数的数组的所有可能排列的解决方案。

class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
length = len(nums)
results = []
def backtrack(first_char_index):
if first_char_index == length:
# print(nums == nums[:])
results.append(nums)
for index in range(first_char_index, length):
nums[first_char_index], nums[index] = nums[index], nums[first_char_index]
backtrack(first_char_index + 1)
nums[first_char_index], nums[index] = nums[index], nums[first_char_index]
backtrack(0)
return results

所以,我测试了这个解决方案,我意识到这个解决方案只有在backtrack函数内部的if条件下,我使用results.append(nums[:])而不是上面的results.append(nums)时才有效。

所以我最初认为这可能是因为nums[:]应该被使用,因为我们需要生成一个新的副本,但后来我在results.append(nums)之前添加了那个print语句,发现所有的print语句都给了我一个True的结果。

我记得看到过一些具有nums[:]而不是nums模式的解决方案,我想问是否有人能阐明额外的[:]到底能做什么?我知道它创建了一个新的副本(即不同的对象,但相同的值(,但既然它有相同的值,为什么会导致不同的结果?

为了说明这一点,输入[1, 2, 3]的结果给出

[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]

当使用nums和时

[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

(正确答案(,当使用nums[:]时。

提前感谢!

编辑:出于某种原因,这个问题被认为与其他关于深度/浅层复制的问题相同。然而,我想我在这里要问的是,由于[:]导致了一个新的、不同的对象,具有相同的值,并且numsnums[:]的值是相同的(打印出来是更改的值(,它不应该附加一个具有更改的值的数组,而不是原始的未更改的nums数组吗?

nums和nums[:]确实有相同的值(使用==检查(,但对象不同(可以使用'is'关键字检查(。序列是可变的,因此您可以在不更改对象本身的情况下更改它们所包含的值。[:]只是创建一个现有序列的副本。这样你就有了一个不同的对象,它具有前一个的所有值

编辑:原因是,当您将nums附加到结果时,即使nums在结果内部,它仍然可以更改。因此,每次更改原始数字时,结果中的元素都会发生更改(事实上,结果中所有的值都是相同的(。如果为结果中的每个元素创建一个副本,那么这些元素都将具有不同的值。

相关内容

最新更新