You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python带求和功能栈pop后求和异常:求原因及修正方案

问题描述

需要实现一个带求和功能的栈类AddingStack,要求:

  • push方法:将值压入栈的同时,把该值累加到sum变量中
  • pop方法:从栈中弹出值的同时,从sum变量中减去该值

目前代码未实现上述核心逻辑,且执行pop后调用求和方法得到的结果不符合预期:实际输出为28,预期应为9。

相关代码

class Stack:
    def __init__(self):
        self.__stack_list = []
        
    def push(self, val):
        self.__stack_list.append(val)
        
    def pop(self):
        val = self.__stack_list[-1]
        del self.__stack_list[-1]
        return val
    

class AddingStack(Stack):
    def __init__(self):
        Stack.__init__(self)
        self.__sum = 0
        
    def add(self):
        for i in self._Stack__stack_list:
            if i in self._Stack__stack_list:
                self.__sum = self.__sum + i
        return self.__sum
    
stack_object = Stack()


stack_object = AddingStack()

stack_object.push(3)
stack_object.push(6)
stack_object.push(10)
print(stack_object._Stack__stack_list)
print(stack_object.add())
stack_object.pop()
print(stack_object._Stack__stack_list)
print(stack_object.add())

实际输出

[3, 6, 10]
19
[3, 6]
28

预期输出

[3, 6, 10]
19
[3, 6]
9
问题原因
  1. 核心逻辑未实现:AddingStack没有重写父类的push和pop方法,完全没做到“push累加、pop减值”的要求,而是靠add方法循环计算总和。
  2. sum变量重复累加:add方法每次调用都会把栈内元素的值累加到__sum上,不会重置。第一次调用后__sum是19,第二次调用时又把当前栈的3+6=9加进去,19+9=28,这就是错误的直接原因。
  3. 私有属性访问不规范:直接用_Stack__stack_list访问父类私有属性,属于依赖Python名称修饰的不规范写法,可读性和维护性差。
解决方案

按照需求重写push和pop方法,实时维护__sum变量,去掉冗余的循环计算:

class Stack:
    def __init__(self):
        self.__stack_list = []
        
    def push(self, val):
        self.__stack_list.append(val)
        
    def pop(self):
        val = self.__stack_list[-1]
        del self.__stack_list[-1]
        return val
    
    # 提供安全的栈元素访问方法(可选)
    def get_stack_elements(self):
        return self.__stack_list.copy()


class AddingStack(Stack):
    def __init__(self):
        super().__init__()  # 更规范的父类构造调用方式
        self.__sum = 0
        
    def push(self, val):
        super().push(val)  # 复用父类的压栈逻辑
        self.__sum += val  # 同步累加值到sum
        
    def pop(self):
        val = super().pop()  # 复用父类的出栈逻辑
        self.__sum -= val  # 同步从sum中减去弹出的值
        return val
    
    def get_sum(self):  # 直接返回维护好的sum,无需循环计算
        return self.__sum


# 测试代码
stack_object = AddingStack()

stack_object.push(3)
stack_object.push(6)
stack_object.push(10)
print(stack_object.get_stack_elements())
print(stack_object.get_sum())
stack_object.pop()
print(stack_object.get_stack_elements())
print(stack_object.get_sum())

运行结果

[3, 6, 10]
19
[3, 6]
9

内容的提问来源于stack exchange,提问作者AshKash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 19:43:15