當我使用append(path)vs.時,我得到了不同的結果。append(list(path))
我有以下代碼來查找總和的所有路徑:
class TreeNode:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
def find_paths(root, sum):
allPaths = []
dfs(root, sum, [], allPaths)
return allPaths
def dfs(root, sum, path, res):
if not root:
return
path.append(root.val)
if root.val == sum and root.left is None and root.left is None:
res.append(path)
dfs(root.left, sum - root.val, path, res)
dfs(root.right, sum - root.val, path, res)
del path[-1]
def main():
root = TreeNode(12)
root.left = TreeNode(7)
root.right = TreeNode(1)
root.left.left = TreeNode(4)
root.right.left = TreeNode(10)
root.right.right = TreeNode(5)
sum = 23
print("Tree paths with sum " str(sum)
": " str(find_paths(root, sum)))
main()
這具有以下輸出:
Tree paths with sum 23: [[], []]
但是,如果我將其更改res.append(path)為res.append(list(path))將回傳正確答案Tree paths with sum 23: [[12, 7, 4], [12, 1, 10]]。我對為什么使用該list操作會改變答案感到困惑。
uj5u.com熱心網友回復:
res.append(path)path將物件本身附加到串列中res。在該行之后,當您修改path物件(如del path[-1])時,修改也會應用于 中的附加物件res,因為它們是同一個物件。
list(path),另一方面,“復制” path. 所以這個現在是一個不同的物件path。之后修改時path,修改不會傳播到這個不同的物件。
如果您這樣做path[:]或path.copy()代替 ,您將得到相同的結果list(path)。
uj5u.com熱心網友回復:
res.append(path)附加實際path物件,而不是它的副本。因此,如果path稍后發生更改,更改也會出現res。
res.append(list(path))附加一個副本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/466420.html
標籤:Python 数组 python-3.x 列表
