类型错误:需1个位置参数但传入4个——矩阵实现作业代码求助
Hey there, let's figure out why you're getting that TypeError: takes 1 positional argument but 4 were given error with your matrix code. First, let's break down your code and the possible issues:
你的代码片段
class MyMatrix(object): def __init__(self, n, m, t): self.n = n self.m = m self.t = t self.data = [] for i in range(0, self.n): row = [] for i in range (0, self.m): # 注意:重复使用变量i会覆盖外层循环的i row.append(self.t()) self.data.append(row) def set(self, i, j, v): self.data[i][j] = v def get(self, i, j): self.data[i][j] # 缺少return语句,调用get()会返回None def __str__(self): n = self.__class__.__name__ + "({})".format((self.n,self.m)) for i in range(0, self.n): for j in... # 代码未完成,存在语法错误
错误原因分析
那个TypeError提示说明你调用某个方法时传递了4个参数,但该方法只接受1个参数(通常是self)。结合你的代码,可能的触发场景有这些:
未完成的
__str__方法导致语法错误
你的__str__方法里for j in...没有写完,这会让Python解析代码时出错,可能给出混淆的参数错误提示。语法错误会干扰解释器对类的正常加载,后续调用方法时就容易出现奇怪的参数问题。错误调用类方法而非实例方法
如果你直接用类名调用set或get(比如MyMatrix.set(1,2,3)),而不是先实例化对象再调用,Python不会自动传递self参数。这种情况下如果误传参数,就可能触发参数数量不匹配的错误。实例化时参数传递错误
虽然你的__init__定义需要3个外部参数,但如果实例化时不小心传了4个(比如MyMatrix(2,3,lambda:0, extra_arg)),也会触发参数数量错误,不过提示会是“takes 4 but 5 were given”。但如果__init__的定义被误改(比如删掉了参数),就会出现“接受1个参数却收到4个”的提示。
修复步骤
补全并修正
__str__方法
先把__str__的代码补全,让它能正确输出矩阵内容:def __str__(self): result = f"{self.__class__.__name__}({self.n}, {self.m})\n" for row in self.data: result += " ".join(map(str, row)) + "\n" return result.strip()修正
get方法的返回值get方法缺少return语句,调用时无法获取矩阵元素,修改为:def get(self, i, j): return self.data[i][j]修复
__init__中的变量覆盖问题
内层循环重复使用i会覆盖外层循环的变量,把内层的i改成j:def __init__(self, n, m, t): self.n = n self.m = m self.t = t self.data = [] for i in range(self.n): row = [] for j in range(self.m): # 替换为j避免变量覆盖 row.append(self.t()) self.data.append(row)确保正确实例化和调用方法
实例化时只传递3个参数,调用方法时先创建实例:# 实例化一个2x3、用0填充的矩阵 mat = MyMatrix(2, 3, lambda: 0) # 调用set方法修改元素 mat.set(0, 0, 5) # 调用get方法获取元素 print(mat.get(0, 0)) # 输出5 # 打印矩阵 print(mat)
按照这些步骤修复后,应该能解决你的TypeError问题,同时修正代码里的其他小缺陷。
内容的提问来源于stack exchange,提问作者Kayla Stewart

