列表列表未正确关联值Python

时间:2019-02-26 14:25:01

标签: python

我创建了一个基本的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)

1 个答案:

答案 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
相关问题