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作为第一个参数。
其他问题修复
arrlen变量作用域问题:__init__里的arrlen = len(self.arr)是局部变量,后续方法无法访问,应改成实例属性self.arrlen = len(self.arr),同时去掉无用的类属性arrlen = 0。- 栈初始化指针错误:空栈的栈顶指针应设为
-1,而非传入的x,否则第一次push会覆盖数组首个元素,导致栈逻辑混乱。 pop方法逻辑缺失:标准栈的pop应返回弹出元素,同时要判断栈是否为空,避免越界报错。printStack输出逻辑问题:range(self.poin)会漏掉栈顶元素,应改成range(self.poin + 1),且重复换行属于冗余操作。- 判断条件优化: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
相关产品推荐
相关产品推荐

