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

2024-09-29 00:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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())。但这似乎有点不自然

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


Tags: 方法机器dictionaryparam堆栈状态poplist
1条回答
网友
1楼 · 发布于 2024-09-29 00:20:24

在这里,您在MyStack.append内传递相同的myState对象,该对象每次都会更新,而不是创建一个新对象。所以,在列表中,你总是得到相同的元素

让我们看看你的程序的数据流

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'}

相关问题 更多 >