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