array [:]在此回溯算法中或在Python中到底有什么作用?

问题描述 投票:1回答:1

所以,我正在解决(或更确切地说,看解决方案哈哈)关于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

所以,我正在测试解决方案,并且我意识到只有在if函数内部的backtrack条件内,我使用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[:]时,正确答案)。

提前感谢!

编辑:出于某种原因,该问题与关于深层/浅层复制的其他问题相同。但是,我想我想问的是,由于[:]导致一个新的,具有same value

的不同对象,并且numsnums[:]的值相同(它显示为更改后的值),是否应该在此后附加更改后的值而不是原始的未修改的nums数组?

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

python indexing syntax backtracking recursive-backtracking
1个回答
2
投票

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


0
投票

它实际上做了深度复制。深度复制是指您复制确切的值,但在另一个内存地址中,这意味着新旧对象是内存中无关的两个对象。

© www.soinside.com 2019 - 2024. All rights reserved.