Python中列表反转的奇怪性能
我运行这个脚本,我不明白列表反转是如何工作的Python中列表反转的奇怪性能,python,list,Python,List,我运行这个脚本,我不明白列表反转是如何工作的 class Queue: def __init__(self): self._push_stack = list() self._pop_stack = list() def push(self, x): self._push_stack.append(x) self._pop_stack.append(x) self._pop_stack.rever
class Queue:
def __init__(self):
self._push_stack = list()
self._pop_stack = list()
def push(self, x):
self._push_stack.append(x)
self._pop_stack.append(x)
self._pop_stack.reverse()
print(self._push_stack, self._pop_stack) # debugging
def pop(self):
if len(self._pop_stack) == 0:
raise IndexError("pop from an empty queue")
else:
self._push_stack.pop()
return self._pop_stack.pop()
queue = Queue()
queue.push(3)
queue.push(5)
queue.push(7)
queue.push(9)
print(queue.pop())
print(queue.pop())
print(queue.pop())
print(queue.pop())
此脚本的输出为:
[3] [3]
[3, 5] [5, 3]
[3, 5, 7] [7, 3, 5]
[3, 5, 7, 9] [9, 5, 3, 7]
7
3
5
9
我不明白的是,为什么[3,5,7]
,当颠倒过来时,是[7,3,5]
,而不是[7,5,3]
;为什么[3,5,7,9]
反向时是[9,5,3,7]
,而不是[9,7,5,3]
PS请忽略脚本的其他缺点。每次都会反转弹出堆栈,这很糟糕。第二次推送后,您有
[5,3]
,然后追加7,留下[5,3,7]
,然后将其反转,得到[7,3,5]
您不需要每次都反转,有关如何正确实现逻辑的解释,请参阅答案。您在追加操作后的每次迭代中都反转列表,这会导致列表在追加7之前被反转,然后被反转。这是因为您没有反转
[3,5,7]
但是[5,3,7]
如果你仔细查看你的代码,你每次推送一个项目时都会反转弹出堆栈。相反,您应该准备:
而不是
self._pop_stack.append(x)
self._pop_stack.reverse()
您可以使用:
self.\u pop\u stack.insert(0,x)
在添加每个元素后,您正在反转pop\u stack
的顺序-这会导致一些非常奇怪的元素顺序您尝试调试代码了吗?我不知道您想要什么解释,奇怪的代码和调试输出尚未演示。您不断翻转self.\u pop\u stack
,因此它以一种奇怪的顺序结束。忽略脚本的其他缺点会忽略这种行为的原因在第二次迭代之后,您有了推送:[3,5]弹出:[5,3]
。然后在每个列表中添加7,这样就有了推送:[3,5,7]弹出:[5,3,7]
。然后你反转pop
,这样你就有了push:[3,5,7]pop:[7,3,5]
。调试输出已经告诉您这一点。