2016-04-11 8 views
2

Ich habe gerade angefangen, SAGE zu verwenden, das ziemlich nah an Python ist, wie ich es verstehe, und ich bin über dieses Problem gekommen, wo ich als Parameter einer Funktion eine Matrix haben werde, die ich mehrfach in der Funktion mit verwenden möchte die gleiche ursprüngliche Funktion, aber durch die verschiedenen Teile der Funktion verändert es Werte.Wie kann ich den Wert meiner Parameter durch eine Funktion erhalten, so dass sie mehrfach mit ihrem Anfangswert verwendet werden kann?

Ich habe in einem Tutorial gesehen, dass die Deklaration einer Variablen in der Funktion als variable = list(parameter) nicht den Parameter oder was auch immer in die Klammern gesetzt wird. Aber ich kann es nicht funktionieren lassen. Unten ist ein Teil meines Programms, das das Problem aufwirft (ich kann den Rest bei Bedarf hinzufügen): Ich deklariere die Variable determinant, die als Wert das Ergebnis der Funktion my_Gauss_determinant mit der Variablen auxmmatrix hat Parameter. Durch die Funktion my_Gauss_determinant ändert sich der Wert auxmmatrix aber aus irgendeinem Grund auch der Wert mmatrix. Wie kann dies vermieden werden und der Parameter mmatrix mit seinem ursprünglichen Wert wiederverwendet werden?

def my_Cramer_solve(mmatrix,bb): 
    auxmmatrix=list(mmatrix) 
    determinant=my_Gauss_determinant(auxmmatrix) 
    if determinant==0: 
     print 
    k=len(auxmmatrix) 
     solution=[] 
     for l in range(k): 
      auxmmatrix1=my_replace_column(list(mmatrix),l,bb) 
      determinant1=my_Gauss_determinant(auxmmatrix1) 
      solution.append(determinant1/determinant0) 
    return solution 
+0

Was ist der Typ von 'mmatrix'? –

+0

Es ist eine Liste zum Beispiel aa = [[1,1], [0,2]] und so ist bb –

Antwort

1

Was Sie wollen, ist ein von mmatrix kopieren. Der Grund, list(other_list) funktioniert, ist, weil es durch jedes Element in other_list iteriert, um eine neue Liste zu erstellen. Aber die veränderbaren Objekte within die Liste nicht

kopiert
>>> a = [{1,2}] 
>>> b = list(a) 
>>> b[0].add(7) 
>>> a 
[set([1,2,7])] 

Um eine vollständige Kopie zu machen, Sie copy.deepcopy verwenden können Kopien der Elemente in der Liste zu machen

>>> import copy 
>>> a = [{1,2}] 
>>> b = copy.deepcopy(a) 
>>> b[0].add(7) 
>>> a 
[set([1,2])] 

Also, wenn Sie nur wollen kopieren Sie die Liste, aber nicht wollen, die Elemente innerhalb der Liste kopieren, würden Sie dies tun

auxmmatrix = copy.copy(matrix) 
determinant = my_Gauss_determinant(copy.copy(matrix)) 

Wenn Sie die Elemente in der Liste als auch kopieren möchten, verwenden Sie copy.deepcopy

+0

Vielen Dank für die Antwort leider ist dies für eine Hausaufgabe und wir dürfen nur die einfachsten Funktionen aus verwenden SAGE, und ich glaube nicht, dass ich copy.deepcopy verwenden kann. –

+0

Wenn es nur eine Liste ist, können Sie eine flache Kopie mit Slicing machen - 'auxmatrix = mmatrix [:]' –

+0

Ich habe immer noch das gleiche Problem, wenn ich 'print mmatrix' vor und nach 'my_Gauss_determinant (auxmatrix)' in der folgenden Code habe ich zwei verschiedene Listen, während ich mmatrix die gleiche behalten möchte 'def my_Cramer_solve (mmatrix, bb): auxmatrix = Liste (mmatrix) determinant = my_Gauss_determinant (auxmstrix)' –