传递给函数时,Python堆栈内容会被覆盖

时间:2014-10-03 22:01:22

标签: python function python-2.7 stack

我写了一个快速的Python函数来反转堆栈的内容。

def ReverseStack(input_stack):
    oldStack = input_stack
    newStack = Stack()

    while not oldStack.isEmpty():
        item = oldStack.pop()
        newStack.push(item)
    return newStack

s = Stack()
s.push('hello')
s.push('world')
s.push('I')
s.push('live')
s.push('underwater')

new = ReverseStack(s)

print "\nOriginal stack..."
while not s.isEmpty():
    print s.pop()

print "\nNew stack..."
while not new.isEmpty():
    print new.pop()

然而,当我去打印每个堆栈的内容(原始和反转)时,似乎原始堆栈的所有内容都已通过pop方法删除。这使我感到困惑,因为我将它作为参数传递给一个函数,该函数创建一个临时堆栈来弹出内容。我以为这样会让原版完好无损。

我的问题是为什么会发生这种情况,纠正它的最佳方法是什么?谢谢!

2 个答案:

答案 0 :(得分:1)

您将一个可变对象传递给ReverseStack,ReverseStack将其变异。 Python在传递给函数时不会复制对象(这会很昂贵),所以你要么自己复制它,要么编写不修改传入函数的函数......除非这是函数的第一位

答案 1 :(得分:1)

该行

oldStack = input_stack

使oldStack成为对同一对象的引用,而不是副本。你需要使用

import copy

复制任意对象。

纠正它的最佳方法可能是迭代堆栈,而不是从中弹出项目。

可能有用的参考:http://www.python-course.eu/deep_copy.php