鱼C论坛

 找回密码
 立即注册
查看: 2338|回复: 3

[已解决]循环出问题了

[复制链接]
发表于 2020-11-10 13:32:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class Matrix:
    def __init__(self,x,y):
        self.x=x
        self.y=y
        self.matrix=[0]*self.x
        self.matrix_column=[0]*self.y
        for i in range(self.x):
            self.matrix[i]=self.matrix_column
        print(self.matrix)
    def inputmatrix(self):
        self.h=0
        while self.h<self.y:
            for self.w in range(self.x):
                self.x=int(input('请输入数字:'))
                self.matrix[self.h][self.w]=self.x
            self.h+=1
        else:
            pass
        print(self.matrix)

m=Matrix(3,3)
这段代码循环这里出问题了,球球大佬们帮我看看
m.inputmatrix()
请输入数字:1
请输入数字:2
请输入数字:3
请输入数字:4
请输入数字:5
请输入数字:6
请输入数字:7
请输入数字:8
请输入数字:9
请输入数字:0
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    m.inputmatrix()
  File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python39\矩阵计算模块.py", line 15, in inputmatrix
    self.matrix[self.h][self.w]=self.x
IndexError: list assignment index out of range
最佳答案
2020-11-10 14:06:49
本帖最后由 jackz007 于 2020-11-10 17:17 编辑

         在 self . x 是对象中的关键属性,在 inputmatrix(self)  函数中,self . x 却被当作临时变量,频繁随意更改,难道你是真的吗?
         把下面两句
                self.x=int(input('请输入数字:'))
                self.matrix[self.h][self.w]=self.x
        改为:
                self . matrix[self.h][self.w] = int(input('请输入数字:'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-10 14:06:49 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-11-10 17:17 编辑

         在 self . x 是对象中的关键属性,在 inputmatrix(self)  函数中,self . x 却被当作临时变量,频繁随意更改,难道你是真的吗?
         把下面两句
                self.x=int(input('请输入数字:'))
                self.matrix[self.h][self.w]=self.x
        改为:
                self . matrix[self.h][self.w] = int(input('请输入数字:'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-10 14:24:17 | 显示全部楼层
        while self.h<self.y:                         #第1个循环,如果初始化为self.y=3,则循环0,1,2
            for self.w in range(self.x):            #第2个循环,如果初始化为self.x=3,则循环0,1,2
                self.x=int(input('请输入数字:'))   #所以你这个循环1次就让你调用1次input()函数让你输入内容
                self.matrix[self.h][self.w]=self.x  #是不是很奇怪超出索引范围?因为你初始化类实例对象语句写错了

正确写法:m()=Matrix(3,3)
========另外,修改建议=======
    def __init__(self,x,y):
        self.x=x
        self.y=y
        self.matrix=[[0 for i in range(self.x)] for i in range(self.y)]  #列表推导式显然简单多了
        print(self.matrix)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-10 16:34:41 | 显示全部楼层
本帖最后由 Lamotu 于 2020-11-10 16:41 编辑

根据你的代码来看楼主是想创建一个[[0,0,0],[0,0,0],[0,0,0]]的初始列表,然后通过输入x,将x的值赋给列表中每个元素。self.w应该是表示大列表中的每个小列表中的每个元素的索引,最大值就是self.y,而且不会变。所以self.matrix[self.h][self.w]=self.x应该是将输入的值赋给小列表中的每个元素,但是self.w的值是根据输入的x变化,这样的话当x的值大于y的时候self.w肯定超过小列表的最大索引值,建议改成
class Matrix:
    def __init__(self,x,y):
        self.x=x
        self.y=y
        self.matrix=[0]*self.x
        self.matrix_column=[0]*self.y
        for i in range(self.x):
            self.matrix[i]=self.matrix_column
        print(self.matrix)
    def inputmatrix(self):
        self.h=0
        while self.h<self.x:
            for self.w in range(self.y):
                self.num=int(input('请输入数字:'))
                self.matrix[self.h][self.w]=self.num
            self.h+=1
        else:
            pass
        print(self.matrix)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 21:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表