2017-04-23 15 views
0

ich einen Code haben, wie lautet:Generator Rückkehr immer das gleiche Element

def xgauss(self): 

    m, n = self.m, self.n 

    M = self.copy() 

    for k in range(n): 
     for i in range(k + 1, m): 
      yield M 
      if not likezero(M[i][k]): 
       lam = M[i][k]/M[k][k] 
       M[i] = M[i] - lam * M[k] 

    yield M 

Vorerst genug ist, zu sagen, dass likezero true zurück, wenn der Wert als Genauigkeit geringer ist (für numerische Vergleiche) ;-)

Mein Ziel ist es, jede Iteration des Gauss Elimination-Algorithmus für Studie Sake (Klassenzimmer) zurückzugeben.

Ich habe einige Testeingaben wie:

In [77]: A 
Out[77]: 
Matrix([ 
     [  1,  4,  1], 
     [  1,  6,  -1], 
     [  2,  -1,  2] 
     ]) 

In [78]: Ab 
Out[78]: 
Matrix([ 
     [  1,  4,  1,  7], 
     [  1,  6,  -1,  13], 
     [  2,  -1,  2,  5] 
     ]) 

Schräge oder nicht, wenn ich den Generator über die Matrix Ab rufen (über AI auch das gleiche Verhalten bekommen), ich habe:

In [76]: list(Ab.xgauss()) 
Out[76]: 
[Matrix([ 
     [  1,  4,  1,  7], 
     [  0,  2,  -2,  6], 
     [  0,  0,  -9,  18] 
     ]), Matrix([ 
     [  1,  4,  1,  7], 
     [  0,  2,  -2,  6], 
     [  0,  0,  -9,  18] 
     ]), Matrix([ 
     [  1,  4,  1,  7], 
     [  0,  2,  -2,  6], 
     [  0,  0,  -9,  18] 
     ]), Matrix([ 
     [  1,  4,  1,  7], 
     [  0,  2,  -2,  6], 
     [  0,  0,  -9,  18] 
     ])] 

Das ist die richtige Antwort (sollte nur die letzte Iteration sein), aber ich kann nicht jeden Schritt sehen, der Generator gibt das Matrixergebnis in allen Iterationen zurück. Ich habe keine Ahnung, was passieren kann.

Antwort

6

In Ihrem Generator haben Sie einen Wert M, der eine Instanz Ihrer Klasse ist. Sie erhalten jedes Mal das gleiche Objekt. Bei jeder Iteration ändern Sie das Objekt. Der Generator liefert keine Kopie von M, er liefert einen Verweis auf M, genauso wie Funktionen keine Kopien zurückgeben, sie geben Referenzen zurück.

Wenn Sie eine Liste der Ergebnisse des Generators erstellen, erstellen Sie eine Liste mit vielen Referenzen auf das gleiche Objekt. Wenn Sie die Liste drucken, wird Ihnen oft das gleiche Objekt angezeigt.

BTW, dieses Verhalten von Python (keine impliziten Kopien, viele Referenzen) wird ausführlicher in meinem PyCon-Talk: Python Names and Values.

+0

Sehr coole Diashow, auch wenn jemand diese Konzepte verstanden hat. Vielleicht möchten Sie einen Haftungsausschluss hinzufügen, dass Sie es gemacht haben. – gyre

Verwandte Themen