Python - "append(List)" 和 "append(List[ : ])" 有什么不同?
Python - What's different with "append(List)" and "append(List[ : ])"?
这是 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[:]" 有什么不同??
当您输入时:
self.resList.append(sublist[:])
Python 正在创建一个新列表对象并将 新列表 的引用附加到 resList。
或者,当您键入:
self.resList.append(sublist)
Python 不会创建新列表,只会附加对子列表的引用,因此您以后对子列表所做的任何更改都会显示在 resList 中。
更清晰的编码方式是:
self.resList.append(list(sublist))
这是 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[:]" 有什么不同??
当您输入时:
self.resList.append(sublist[:])
Python 正在创建一个新列表对象并将 新列表 的引用附加到 resList。
或者,当您键入:
self.resList.append(sublist)
Python 不会创建新列表,只会附加对子列表的引用,因此您以后对子列表所做的任何更改都会显示在 resList 中。
更清晰的编码方式是:
self.resList.append(list(sublist))