2017-11-17 9 views
0

ich eine einfache Funktion, die die Diagonale eines Arrays abzulaufen soll, und schalten Sie alle Werte auf 0.Stopp Python Funktionen Eingänge Überschreibung

def diagonal_zeros(dataset): 
    zero = dataset[:] 
    length = len(zero) 
    for i in range(length): 
     zero[i, i] = 0 
    return zero 

Wenn ich diese Funktion auf einem Array laufen, es gibt das neue, korrekte 'Null' Array, aber es geht auch zurück und überschreibt den ursprünglichen 'Datensatz'. Ich hatte gedacht, dass die Linie zero = dataset[:] dies verhindert hätte.

Ich weiß nicht, jedoch erhalten das gleiche Verhalten mit dieser Funktion:

def seperate_conditions(dataset, first, last): 
    dataset = dataset[first:last, :] 
    return dataset 

, die die erste Datenmenge unverändert lässt. Ich habe StackOverflow Antworten auf verwandte Fragen gelesen, aber ich kann nicht für das Leben von mir das herausfinden. Ich arbeite an einer wissenschaftlichen Analyse-Pipeline, so dass ich wirklich in der Lage sein werde, bei jedem Schritt auf die Matrizen zurückzugreifen.

Dank

+0

Sie verwenden 'numpy', nehme ich an. 'numpy' slicing gibt eine Ansicht zurück, keine Kopie. –

Antwort

1

Argumente in Python durch Zuordnung (dank @ juanpa.arrivillaga für die Korrektur) und nicht als Wert übergeben. Dies bedeutet, dass die Funktion im Allgemeinen keine Kopie des Arguments, sondern einen "Zeiger" auf das Argument selbst erhält. Wenn Sie das Objekt ändern, auf das durch das Argument in der Funktion verwiesen wird, ändern Sie dasselbe Objekt außerhalb. Here's a page with some more information.

Eine Möglichkeit besteht darin, das copy module innerhalb Ihrer Funktion zu verwenden, um eine Kopie des Datasets zu erstellen.

Als Beispiel für den Code:

import copy 
myDataset = [[1,2,3],[2,3,4],[3,4,5]] 

def diagonal_zeros(dataset): 
    zero = copy.deepcopy(dataset) 
    length = len(zero) 
    for i in range(length): 
     zero[i][i] = 0 
    return zero 

result = diagonal_zeros(myDataset) 
print(result)  #[[0, 2, 3], [2, 0, 4], [3, 4, 0]] 
print(myDataset) #[[1, 2, 3], [2, 3, 4], [3, 4, 5]] 

This article hat mir sehr geholfen mit diesem Konzept.

+1

@ juanpa.arrivillaga Sie haben Recht, ich habe den Kommentar für die Klarheit bearbeitet. –