Python:为什么列表的内容内部和外部函数不同?

时间:2018-10-19 07:48:33

标签: python list global-variables

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

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]

The tree

输入:v1 = 1,v2 = 7

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

1 个答案:

答案 0 :(得分:2)

您似乎相信,在您的return函数中按下显式search之后,您的递归搜索就会停止。但事实并非如此。 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

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