我创建了一个基本的python程序,该程序最终将尝试与Matricies一起使用,但是遇到了一个我无法理解的问题。
设置0'th
列表中的0'th
元素时,程序会将第一个列表的0'th
元素分配给相同的值(在本例中为该值)
没有理由这样做,因为该程序没有导入的模块或其他任何会影响我已经编写的内容的
请帮助
class Matrix(object):
def createMatrix(self):
self.values = [1, 2, 3, 4]
self.rows = 2
self.coloms = 2
self.colomList = [0] * self.coloms
self.matrix = [self.colomList] * self.rows
test = Matrix()
test.createMatrix()
print(test.matrix)
test.matrix[0][1] = 1
print(test.matrix)
答案 0 :(得分:1)
您正在创建一个列表[0, 0]
,然后将该相同的列表分配给两行。请改用此方法(注意“列”的正确拼写):
def create_matrix(self):
# self.values = [1, 2, 3, 4]
self.rows = 2
self.columns = 2
self.matrix = [[0 for _ in range(self.columns)] for _ in range(self.rows)]
只是一个建议,但您可能还想更改该方法以接受宽度和高度的参数,并在实例化对象时使用__init__
方法来完成所有这些操作:
class Matrix(object):
def __init__(self, width=2, height=2):
self.width = width
self.height = height
self._matrix = [[0 for _ in range(width)] for _ in range(height)]
print(Matrix()._matrix) # uses default values: [[0, 0], [0, 0]]
print(Matrix(4, 3)._matrix) # [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
作为进一步的改进,我们可以看到宽度和高度取决于self._matrix
,因此我们可以动态地计算宽度和高度,而不必将其存储为属性,以确保它们不会不同步:< / p>
class Matrix(object):
def __init__(self, width=2, height=2):
self._matrix = [[0 for _ in range(width)] for _ in range(height)]
def height(self):
return len(self._matrix)
def width(self):
return len(self._matrix[0])
print(Matrix(4, 3).width()) # 4
print(Matrix(4, 3).height()) # 3