2016-12-08 5 views
0

listをスタックに、dictionaryを現在のマシン状態として使用して、Pythonにスタックマシンを実装しようとしています。しかし、それは計画どおりには機能しません。いくつかのデバッグの後、マシンの状態をスタックに格納し、状態を変更すると、格納された状態も変化することがわかりました。`Python`で` dictionary`型のためのスタックを実装するのに最も慣れ親しんだ方法は何ですか?

MyStack = []   
myState = {} 
myState['param'] = '1' 
MyStack.append(myState) 
myState['param'] = '2' 
MyStack.append(myState) 
myState['param'] = '3' 
MyStack.append(myState) 
print(MyStack.pop()) 
print(MyStack.pop()) 
print(MyStack.pop()) 

結果は次のとおりです:

{'param': '3'} 
{'param': '3'} 
{'param': '3'} 

そしてない

{'param': '3'} 
{'param': '2'} 
{'param': '1'} 

私は明らかに

Python店舗listの中を思うと ここに私の問題を実証する例です。私ののコピーではないを参照してください。したがって、実際にはスタックされたアイテムはすべて同じmyStateオブジェクトです。私がこれを持っているとき、私はのような方法を使ってこの問題を回避しました:MyStack.append(myState.copy())。しかし、それは少し不自然なようです。

質問:これはdictionaryタイプのスタックをPythonに実装するのに最も慣用的な方法ですか?

+0

「私が発見した私はスタックにマシンの状態を保存する場合、および状態を変更すると、保存された状態も変化します。これは「参照渡し」と呼ばれます。基本的には、スタックにdictをプッシュしてもdictはコピーされませんでしたが、後で同じdictを参照する方法が保存されました。 –

答えて

0

ここでは、同じmyStateオブジェクトをMyStack.appendに渡します。このオブジェクトは、新しいオブジェクトを作成するのではなく、毎回更新されます。リスト内では、常に同じ同一の要素が得られます。

あなたのプログラムのデータフローを見てみましょう。私は願っています

MyStack = []   
myState = {}    # An empty dictionary 'myState' created 
myState['param'] = '1' # 'mystate' -> {'param':'1'} 
MyStack.append(myState) # 'MyStack' -> [mystate] -> [{'param':'1'}] 
myState['param'] = '2' # 'mystate' -> {'param':'2'} 
MyStack.append(myState) # 'MyStack' -> [mystate,mystate ] 
          #      -> [{'param':'2'},{'param':'2'}] 
myState['param'] = '3' # 'mystate' -> {'param':'3'} 
MyStack.append(myState) # 'MyStack' -> [mystate,mystate, mystate] 
          #  -> [{'param':'3'},{'param':'3'},{'param':'3'}]  

、それは今あなたには明らかです。あなたは新しい辞書を毎回作成するのではなく、同じものを使用していることを確認

:これを解決する方法

myState['param'] = '2'myState['param'] = '3'前に、ちょうど呼び出し、

myState = myState.copy() 

コード:

MyStack = []   
myState = {} 
myState['param'] = '1' 
MyStack.append(myState) 
myState = myState.copy() 
myState['param'] = '2' 
MyStack.append(myState) 
myState = myState.copy() 
myState['param'] = '3' 
MyStack.append(myState) 
print(MyStack.pop()) 
print(MyStack.pop()) 
print(MyStack.pop()) 

出力:

{'param': '3'} 
{'param': '2'} 
{'param': '1'} 
関連する問題