【问题标题】:Python - What's different with "append(List)" and "append(List[ : ])"? [duplicate]Python - “追加(列表)”和“追加(列表[:])”有什么不同? [复制]
【发布时间】:2026-02-10 14:10:02
【问题描述】:

这是LeetCode 39 problem的答案,我在github上找到了。

class Solution(object):
def combinationSum(self, candidates, target):

    self.resList = []
    candidates = sorted(candidates)
    self.dfs(candidates, [], target, 0)
    return self.resList

def dfs(self, candidates, sublist, target, last):
    if target == 0:
        // Change this line
        self.resList.append(sublist[:])
    if target < candidates[0]:
        return
    for n in candidates:
        if n > target:
            return
        if n < last:
            continue
        sublist.append(n)
        self.dfs(candidates, sublist, target - n, n)
        sublist.pop()

myClass = Solution()
result = myClass.combinationSum([2, 3, 5], 8)
print(result)

对于这种情况,输出是正确的。

[[2, 2, 2, 2], [2, 3, 3], [3, 5]]

但如果我改变了

...
self.resList.append(sublist[:])
...

到这里

...
self.resList.append(sublist)
...

输出将是

[[], [], []]

我不知道这里的“sublist”和“sublist[:]”有什么不同??

【问题讨论】:

  • 切片操作 ([;]) 创建列表的浅表副本,并将对浅表副本的引用附加到 resList。当您删除切片操作时,您将附加原始列表的视图/引用,并且您对该列表所做的任何更改都将反映在 resList 中。

标签: python python-3.x list append microsoft-distributed-file-system


【解决方案1】:

当您键入时:

self.resList.append(sublist[:])

Python 正在创建一个新列表对象并将 新列表 的引用附加到 resList。

或者,当您键入时:

self.resList.append(sublist)

Python 不会创建新列表,只会附加对 sublist 的引用,因此您将来对 sublist 所做的任何更改都将显示在 resList 中。

更清晰的编码方式是:

self.resList.append(list(sublist))

【讨论】:

  • 第一个也附加了一个引用;它只是对不同列表的引用,并且append的形参引用。