我编写了一个快速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方法删除。这让我很困惑,因为我把它作为参数传递给了一个函数,该函数创建了一个临时堆栈来弹出内容。我原以为这样会使原件完好无损。
我的问题是,为什么会发生这种情况,最好的纠正方法是什么?谢谢
行
oldStack = input_stack
使oldStack成为对同一对象的引用,而不是副本。你需要使用
import copy
以复制任意对象。
纠正它的最好方法可能是遍历堆栈,而不是从堆栈中弹出项目
可能有用的参考:http://www.python-course.eu/deep_copy.php
您将一个可变对象传递给ReverseStack,而ReverseStack对其进行了突变。Python在传递给函数时不会复制对象(这会很昂贵),所以您要么自己复制它,要么编写不修改传入内容的函数……除非这是函数的重点。