2014-10-03 111 views
1

我編寫了一個快速的Python函數來反轉堆棧的內容。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方法去除。這使我感到困惑,因爲我將它作爲參數傳遞給一個函數,該函數創建了一個臨時堆棧來彈出內容。我認爲這種方式會使原文保持原樣。

我的問題是爲什麼會發生這種情況,糾正它的最好方法是什麼?謝謝!

回答

1

oldStack = input_stack 

使得oldStack參考相同的對象,而不是拷貝。您需要使用

import copy 

複製任意對象。

也許糾正它的最好方法是遍歷堆棧,而不是彈出它的項目。

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

+1

不錯,我知道它必須是這樣的,我只是不知道如何去解決它。謝謝! – StormTrooper123 2014-10-03 22:21:03

1

您將可變對象傳遞給ReverseStack並將其改變爲ReverseStack。 Python在傳遞給函數時不會複製對象(這會很貴),因此您必須自己複製它或編寫不會修改傳入內容的函數......除非這是函數的重點。

+1

啊啊,這是合理的,感謝您的幫助! – StormTrooper123 2014-10-03 22:22:42