有什么区别listA.append文件(列表B[:])和listA.append文件(列表B)?

2024-04-26 18:13:56 发布

您现在位置:Python中文网/ 问答频道 /正文

在leetcode中尝试了python3回溯。对于下面的代码,附加答案(stack[:])工作,但附加答案(堆叠)不是。你知道吗

提前谢谢。你知道吗

Leetcode。你知道吗

def combine(self, n, k):
    """
    :type n: int
    :type k: int
    :rtype: List[List[int]]
    """
    nums = list(range(1,n+1))
    ans = []
    stack = []

    def backtracking( current_pos = 0, current_in_tuple = 0, rest = n):
        if current_in_tuple == k:
            ans.append(stack)
            return
        if rest + current_in_tuple < k:
            return

        for i in range(current_pos, n-k+current_in_tuple+1):
            stack.append(nums[i])
            backtracking(i+1, current_in_tuple+1, rest-1)
            stack.pop()


    backtracking()

    return ans

输入:4,2

Actual:[[],[],[],[],[],[]]
Expected:[[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]

Tags: 答案inrestreturnstackdeftyperange
2条回答

不同之处在于listA.append(listB)将listB的浅拷贝添加到listA,这意味着如果listB随后发生更改(即通过调用listB.pop())),那么更改也将发生在listA中。你知道吗

但是listA.append(listB[:])是一个完全独立的副本,没有链接到原始的listB。你知道吗

我会给你一些提示来调试它,stack[:]创建一个新的数组,而stack引用的是同一个数组,你可以通过比较这两个数组的id来检查它,查看指向内存中不同位置的点

In [1]: a=[1,2,3]

In [2]: id(a)
Out[2]: 139944147306568

In [3]: id(a[:])
Out[3]: 139944156641672

您可以在下面的示例中看到结果数组中实际发生了什么

In [4]: b=[]

In [5]: b.append(a)

In [6]: b
Out[6]: [[1, 2, 3]]

In [7]: a[0]=400

In [8]: b
Out[8]: [[400, 2, 3]]

请注意,在修改b之后a会被修改,这就是代码输出错误的原因

我希望你觉得它有用:)

相关问题 更多 >