【问题标题】:Python: why contents of list are different inside and outside function?Python:为什么列表的内容在函数内外不同?
【发布时间】:2018-10-19 07:48:33
【问题描述】:

我有一个执行二叉树遍历的函数,并且我有一个全局列表“堆栈”来存储临时值。

stack = []

def search(root, v):
    global stack
    stack.append(root.info)    
    if root.info == v:
        print(stack) #<------- THE FIRST PRINT IS HERE
        return
    if root.left is not None:
        search(root.left, v)
    if root.right is not None:
        search(root.right, v)
    stack.pop()
    pass

def lca(root, v1, v2):
    search(root,v1)
    print(stack) #<------- THE SECOND PRINT IS HERE

你的输出(标准输出)

[4, 2, 1]
[4]

输入:v1=1, v2=7

当我从函数内部和外部打印列表的值时,我发现结果是不同的——在内部打印时,结果是[4,2,1],而外部是[4]。我尝试了不同的方法,比如在函数外部创建列表,然后将其传递给函数,结果总是一样的。有谁知道为什么会这样?

【问题讨论】:

  • 你能精确你的数据吗?你的树的价值是什么?对我来说,stack.pop() 似乎是您问题的根源,您在每次迭代时都从列表中检索最后一个元素,但即使不知道您的数据结构和值,也很难回答。
  • 有时您的search 函数会打印stack 并提前返回。有时它不打印,一直到函数结束。由于search 是递归的,因此会执行多个search 调用,其中一些会打印stack,而其中一些会更改stack 并且不打印它。没有理由期望 stack 在打印时的内容与最终内容相同。
  • 您似乎相信在您的search 函数中点击return 后,您的递归搜索就会停止。但事实并非如此。调用堆栈更高的search 调用仍将继续触发更多搜索,从stack 弹出内容,更改其内容。
  • @NyuB 树会是这样的link
  • 而v1的价值是什么?

标签: python list global-variables


【解决方案1】:

您似乎相信在您的search 函数中点击显式return 后,您的递归搜索就会停止。但事实并非如此。 search 调用堆栈更高的调用仍将继续触发更多搜索,从stack 弹出内容,更改其内容。

也许你想要这样的事情:当它成功找到它正在寻找的东西时,使用返回值从search 发出信号,并且在此之后不再搜索。

def search(root, v):
    global stack
    stack.append(root.info)    
    if root.info == v:
        print(stack)
        return True
    if root.left is not None and search(root.left, v):
        return True
    if root.right is not None and search(root.right, v):
        return True
    stack.pop()
    return False

这将防止堆栈在找到值之后被更改。

【讨论】:

  • 谢谢!启发!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
相关资源
最近更新 更多