Beste mensen,
Ik zit met een issue, want ik ben tot de conclusie gekomen dat ik er geen kont meer van snap, hoewel ik toch een tijdje al weer zit te programmeren in Python. En aangezien ik het idee heb dat ik iets heel erg basis fout doe, is dat gevaarlijk voor de rest van mijn brouwsels dus heb ik hulp nodig.
Ik heb een eigen 'class' waarin ik simuleer dat ik een matrix heb. Ofwel het bevat gewoon een lijst met waaden en als cols en rows 8 is en ik een lijst van 64 waarden heb, kan ik dan mooi waarde (2,3) bijvoorbeeld opvragen.
Nu doe ik het volgende (versimpeld), om het gemiddelde van de laagste 3 waarden te verkrijgen
Dat gaat allemaal prima. Denk je. Alleen nu blijkt dat de data in testmatrix ook gewoon wordt gesorteerd. Het lijkt dus alsof ipv de data naar datalijst wordt gekopieerd er in werkelijkheid een referentie wordt gekopieerd.
Ook als ik het via een omslachtige, gare manier doe gaat het fout
idee was ik doe het wel via een andere 'matrix', maar copydata doet in feite:
targetmatrix.data = self.data geeft dus wellicht ook gewoon een referentie door?
Los van het feit dat er allerlei andere handige dingen gebruikt kunnen worden voor het achterliggende doel, hoe voorkom ik dat de rest meesorteert?
Ik zit met een issue, want ik ben tot de conclusie gekomen dat ik er geen kont meer van snap, hoewel ik toch een tijdje al weer zit te programmeren in Python. En aangezien ik het idee heb dat ik iets heel erg basis fout doe, is dat gevaarlijk voor de rest van mijn brouwsels dus heb ik hulp nodig.
Ik heb een eigen 'class' waarin ik simuleer dat ik een matrix heb. Ofwel het bevat gewoon een lijst met waaden en als cols en rows 8 is en ik een lijst van 64 waarden heb, kan ik dan mooi waarde (2,3) bijvoorbeeld opvragen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| class Mat: def __init__(self, rows, columns): #initialize a 'matrix' if rows <=0 or columns <= 0: raise Exception("Cannot use 0 or negative as value for rows/columns") self.rows=rows self.columns=columns self.data=[] def getpx(self,row,column): #return a certain pixel if len(self.data) == 0: raise Exception("There is no data in the current Matrix") if row <=0 or column <= 0: raise Exception("Cannot use 0 or negative as value for rows/columns") return self.data[(row-1)*self.columns+(column-1)] |
Nu doe ik het volgende (versimpeld), om het gemiddelde van de laagste 3 waarden te verkrijgen
code:
1
2
3
4
| testmatrix = Mat(8,8,lijstvan64waarden) #initialiseren datalijst = testmatrix.data sortlijst=datalijst.sort() avgmindata=sum(sortlijst[0:3])/3 #laagste 3 waarden optellen en delen door 3 |
Dat gaat allemaal prima. Denk je. Alleen nu blijkt dat de data in testmatrix ook gewoon wordt gesorteerd. Het lijkt dus alsof ipv de data naar datalijst wordt gekopieerd er in werkelijkheid een referentie wordt gekopieerd.
Ook als ik het via een omslachtige, gare manier doe gaat het fout
code:
1
2
3
4
5
| sortmat=Mat(8,8) gridDataAvgMat.copyData(sortmat) sortlijst=sortmat.data sortlijst.sort() avgmindata=sum(sortlijst[0:3])/3 |
idee was ik doe het wel via een andere 'matrix', maar copydata doet in feite:
code:
1
2
3
4
5
6
7
8
9
| def copyData(self,targetmatrix): #Function to copy all data from one Mat to another if not isinstance(targetmatrix, Mat): raise Exception("Trying to copy data from Mat object to non-Mat object") if targetmatrix.rows != self.rows or targetmatrix.columns != self.columns: raise Exception("Trying to copy data from Mat object to another Mat object while columns / rows do not match!") if len(self.data) == 0: raise Exception("There is no data in the current Matrix to copy") targetmatrix.data=self.data |
targetmatrix.data = self.data geeft dus wellicht ook gewoon een referentie door?
Los van het feit dat er allerlei andere handige dingen gebruikt kunnen worden voor het achterliggende doel, hoe voorkom ik dat de rest meesorteert?