在Python中初始化类中的2D数组
我试图用python创建一个3x3矩阵类。我无法正确初始化2D数组 在下面的代码中,我得到一个错误,说Matrix3x3没有属性m。如果我在init之前初始化m,那么看起来“m”的行为就像一个静态变量,这是我不想要的在Python中初始化类中的2D数组,python,class,multidimensional-array,Python,Class,Multidimensional Array,我试图用python创建一个3x3矩阵类。我无法正确初始化2D数组 在下面的代码中,我得到一个错误,说Matrix3x3没有属性m。如果我在init之前初始化m,那么看起来“m”的行为就像一个静态变量,这是我不想要的 class Matrix3x3: #[1 0 0] #[0 1 0] #[0 0 1] def __init__(self, m): #self.m[row][column] self.m[0][0] = m[0][0
class Matrix3x3:
#[1 0 0]
#[0 1 0]
#[0 0 1]
def __init__(self, m):
#self.m[row][column]
self.m[0][0] = m[0][0];
self.m[0][1] = m[0][1];
self.m[0][2] = m[0][2];
self.m[1][0] = m[1][0];
self.m[1][1] = m[1][1];
self.m[1][2] = m[1][2];
self.m[2][0] = m[2][0];
self.m[2][1] = m[2][1];
self.m[2][2] = m[2][2];
此类将生成一个矩阵3x3
class Matrix3x3:
def __init__(self):
self.m = []
for item in range(3):
self.m.append([0,0,0])
mat = Matrix3x3()
print(mat.m)
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
可以将其展开以创建X大小的矩阵
class Matrix_x_sized:
def __init__(self,x):
self.m = []
for item in range(x):
self.m.append([0]*x)
mat2 = Matrix_x_sized(4)
mat2.m
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
试试这个:)
Mayby一开始不是100%可读的,但可以工作:)在设置其元素之前,必须将m分配为列表列表:
class Matrix3x3:
#[1 0 0]
#[0 1 0]
#[0 0 1]
def __init__(self, m):
#allocate the lists : m is a list containing 3 lists of 3 None values
self.m = [ [ None for j in range(3) ] for i in range(3) ]
for i in range(3):
for j in range(3):
self.m[i][j] = m[i][j];
或者更直接:
class Matrix3x3:
#[1 0 0]
#[0 1 0]
#[0 0 1]
def __init__(self, m):
# directly init self.m
self.m = [ [ m[i][j] for j in range(3) ] for i in range(3) ]
问题是
m
必须存在才能设置其元素,即使如此,如果列表太短,尝试设置列表中元素的值也将失败。所以
lst = []
lst[0] = 0
将失败,但
lst = []
lst.append(0)
我们会成功的lst[0]=0
应视为试图更改索引0
处lst
的值,如果lst
没有索引0
,则不能使用
然而,做你想做的事情最简单的方法是通过列表理解
class Matrix3x3:
def __init__(self, m):
self.m = [[m[i][j] for j in xrange(len(m[i]))] for i in xrange(len(m))]
或者使用deepcopy
,如果您不打算更改输入:
from copy import deepcopy
class Matrix3x3:
def __init__(self, m):
self.m = deepcopy(m)
另外,如果这不是对某种类型的赋值,你应该考虑使用,它有一组内置的矩阵运算,而不是试图滚动自己。
不要将<代码> m <代码>作为init的参数。只要在可能的重复结构中声明M“忘记<代码> m < /代码>,只使用<代码>[0代表uu-in-xrange(3)]代表u-in-xrange(3)]你到底为什么需要这个?矩阵和数组解决方案已经存在,特别是看numpy。这是如何创建列表的?@padraickenningham-Oups,使用了错误的大括号:对响应进行了后期编辑。我看了一会儿后意识到这一点。from copy import deepcopy
class Matrix3x3:
def __init__(self, m):
self.m = deepcopy(m)