矩阵创建和赋值 Python

Matrix creation and assignment Python

为什么要像这样创建一个先乘以行再乘以列的矩阵;

class Blíster:
def __init__(self,row,columns):
    self.nfil=row
    self.ncol=columns
    self.__matriu=[[True]*columns]*row

def __getitem__(self,i):
    return self.__matriu[i[0]][i[1]]

def __setitem__(self,i,p):
    self.__matriu[i[0]][i[1]]= p      

不同于追加行,如下所示:

class Blíster:
def __init__(self, rows, columns) :
    self.nfil = rows
    self.ncol = columns
    self.cavitats = []
    for i in range(rows) :
        self.cavitats.append([True]*columns)
        
def __getitem__(self, pos) :
    return self.cavitats[pos[0]][pos[1]]

def __setitem__(self, pos, p) :
    self.cavitats[pos[0]][pos[1]] = p

当我尝试

b = blíster.Blíster(3, 6)
b[1, 2] = False
b[2, 5] = False
b[2, 4] = False
b[1, 3] = False
c = 0
for i in range(3) :
   for j in range(6) :
      if b[i, j] :
          c = c + 1

使用第一种创建矩阵的方法,我得到 c=6 所以它在矩阵中给False赋值了4次以上,我也不知道为什么。如果有人能向我解释一下,我将不胜感激:D

用第二种方法,我得到了c=14,很好的答案。

在您的第一个实现中,每一行在内存中都是相同的,因此更改一行中的值会更改所有行中的值。

>>> myList = [[True]*2]*3
>>> myList
[[True, True], [True, True], [True, True]]
>>> myList[0][0] = False
>>> myList
[[False, True], [False, True], [False, True]]

此行为的机制在对 this question 的回答中进行了解释。