在`Python`中为`dictionary`类型实现堆栈最常用的方法是什么?

时间:2016-12-08 07:00:51

标签: python dictionary stack

我正在尝试使用Python作为我的堆栈并使用list作为当前机器状态在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存储在dictionary中,而不是myState的副本,但是对它的引用。因此,实际上所有堆叠的项目都是相同的dictionary.copy()对象。当我得到这个时,我使用MyStack.append(myState.copy())方法来解决问题:dictionary。但它似乎有点不自然。

所以,问题是:在Python中为category1/category2类型实现堆栈的最惯用的方法是什么?

1 个答案:

答案 0 :(得分: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'}