为什么在将列表附加到列表时需要放置 list()?

  • 本文关键字:列表 list python python-3.x
  • 更新时间 :
  • 英文 :


这是我现在在Python3中做的编码问题:

class TreeNode:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
def find_paths(root, targetSum):
allPaths = []
dfs(root, targetSum, [], allPaths)
return allPaths

def dfs(node, targetSum, currentPath, result):

if not node:
return

currentPath.append(node.val)
if node.val == targetSum:
if not node.left and not node.right:
result.append(list(currentPath))
else:
dfs(node.left, targetSum - node.val, currentPath, result)
dfs(node.right, targetSum - node.val, currentPath, result)
# backtrack here
del currentPath[-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)
required_sum = 23
print(find_paths(root, required_sum))

main()

问题是这行就在这里:

result.append(list(currentPath))

它打印出:

[[12, 7, 4], [12, 1, 10]]

但是如果你把:

result.append(currentPath)

它将打印出来:

[[], []]

我尝试打印出"currentPath"的类型,它已经是一个列表。当列表已经是列表类型时,为什么它是必不可少的?

因为这个:

del currentPath[-1]

换句话说:您正在将currentPath对象添加到结果对象,但稍后对其进行了修改。修改反映在您的result中。使用list(…)创建列表的副本

在您的情况下,如果您这样做

result.append(currentPath)

然后将对象追加currentPath。实际上,您可以将其视为将指针附加到对象currentPath。这意味着result实际上将持有currentPath而不是currentPath的内容。

因此,当你会做

del currentPath[-1]

您将更改currentPath对象。由于result具有实际的currentPath,因此result也会被修改。

但!

当你在做

result.append(list(currentPath))

您正在附加一个新对象,具有currentPath的内容。这会导致result具有不同的对象,而不是实际的currentPath。这是因为list()将从currentPath的内容创建一个新列表。

因此,当您currentPath使用

del currentPath[-1]

不会修改result


要自行验证,您可以检查

id(result[0])
id(currentPath)

使用.append(list(currentPath))和使用.append(currentPath)时。

相关内容

  • 没有找到相关文章

最新更新