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

Python栈类push方法报错:TypeError参数数量不匹配问题求助

Python栈类调用push方法报错的原因与修复

错误信息

TypeError: stack.push() takes 1 positional argument but 2 were given

问题代码

栈类实现

class stack:
    arrlen = 0
    def __init__(self,arr,poin):
        self.arr = arr
        self.poin = poin
        arrlen = len(self.arr)

    def push(obj):
        self.poin = (self.poin+1)%arrlen
        self.arr[self.poin] = obj

    def pop():
        self.poin = (self.poin-1)%arrlen

    def printStack():
        for i in range(self.poin):
            print("",self.arr[i])
            print("\n")

调用代码

x = int(input("Hello.Please write down the number of tasks you want to do for today:\n"))
array = [None]*x
y = 0
mytasks = stack(array,x);
while(y is not 4):
    y = int(input("What do you want to do 1)add task 2) remove task 3)print remaining tasks 4)exit\n"))
    if y is 1:
            tsk = input("Write down the name of your task:\n")
            mytasks.push(tsk)
    if y is 2:
            mytasks.pop()
    if y is 3:
            mytasks.printStack()

错误原因及修复

核心错误:实例方法缺少self参数

Python中类的实例方法必须把self作为第一个参数(名字可自定义,但约定用self),它代表调用方法的实例本身。当你执行mytasks.push(tsk)时,Python会自动把mytasks作为第一个参数传给push,再加上你传入的tsk,总共2个参数,但你的push方法只定义了obj一个参数,因此触发这个类型错误。

同理,pop和printStack方法也存在同样问题,都需要添加self作为第一个参数。

其他问题修复

  1. arrlen变量作用域问题:__init__里的arrlen = len(self.arr)是局部变量,后续方法无法访问,应改成实例属性self.arrlen = len(self.arr),同时去掉无用的类属性arrlen = 0。
  2. 栈初始化指针错误:空栈的栈顶指针应设为-1,而非传入的x,否则第一次push会覆盖数组首个元素,导致栈逻辑混乱。
  3. pop方法逻辑缺失:标准栈的pop应返回弹出元素,同时要判断栈是否为空,避免越界报错。
  4. printStack输出逻辑问题:range(self.poin)会漏掉栈顶元素,应改成range(self.poin + 1),且重复换行属于冗余操作。
  5. 判断条件优化:Python中判断值相等用==,is是判断对象身份,不适合用来比较数值。

修复后的完整代码

class Stack:
    def __init__(self, arr):
        self.arr = arr
        self.poin = -1  # 空栈栈顶指针初始为-1
        self.arrlen = len(self.arr)

    def push(self, obj):
        # 判断栈是否已满
        if (self.poin + 1) % self.arrlen == self.poin:
            print("栈已满,无法添加任务")
            return
        self.poin = (self.poin + 1) % self.arrlen
        self.arr[self.poin] = obj

    def pop(self):
        # 判断栈是否为空
        if self.poin == -1:
            print("栈已空,无法移除任务")
            return None
        popped_val = self.arr[self.poin]
        self.poin = (self.poin - 1) % self.arrlen if self.poin != 0 else -1
        return popped_val

    def print_stack(self):
        if self.poin == -1:
            print("当前没有任务")
            return
        print("剩余任务:")
        for i in range(self.poin + 1):
            print(f"- {self.arr[i]}")

# 调用代码
x = int(input("请输入今天要完成的任务数量上限:\n"))
array = [None] * x
y = 0
mytasks = Stack(array)
while y != 4:
    y = int(input("请选择操作:1)添加任务 2)移除任务 3)查看剩余任务 4)退出\n"))
    if y == 1:
        tsk = input("请输入任务名称:\n")
        mytasks.push(tsk)
    elif y == 2:
        mytasks.pop()
    elif y == 3:
        mytasks.print_stack()
    elif y != 4:
        print("无效选项,请重新输入")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:25:20