我正在尝试使用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
类型实现堆栈的最惯用的方法是什么?
答案 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'}