Seite 1 von 1

numpy.arrays in functionen

Verfasst: Montag 7. Juni 2010, 09:38
von Pretender2k
Hallo zusammen,

ich hab folgendes Problem. Hier ist noch alles in Ordnung:

Code: Alles auswählen

def test(oink):
	blub = oink
	blub = 8
	return blub
	
oink = 2
flup = test(oink)

print oink
print flup

>>> Ausgabe
2
8
Die Variable oink ist 2 und flup ist 8. So soll es meiner Vorstellung nach auch sein :) Jetzt mein Problem mit den arrays.

Code: Alles auswählen

from numpy import array, ones

def arraytest(matrix1):
	matrix2 = matrix1
	matrix2[:,0] = 20
	return matrix2
	
test_matrix = ones([4,2])
erg_matrix = arraytest(test_matrix)

print test_matrix
print erg_matrix

>>Ausgabe
[[ 20.   1.]
 [ 20.   1.]
 [ 20.   1.]
 [ 20.   1.]]
[[ 20.   1.]
 [ 20.   1.]
 [ 20.   1.]
 [ 20.   1.]]
Wie es scheint, wird hier eine Referenz uebergeben. Ich will aber die Funktion nicht "call by referenz" sondern "call by value" aufrufen. Also die test_matrix soll weiterhin nur aus Einsen bestehen. Weiss jemand wie man das korrekt macht?

Re: numpy.arrays in functionen

Verfasst: Montag 7. Juni 2010, 09:54
von HerrHagen
Die Objekte werden in Python immer als Referenz (oder wie man das auch immer bezeichnen mag - dazu gab es in diesem Forum schon lange Diskussionen) übergeben. Das fällt bloß bei unveränderöichen Typen wie int's nicht auf.
Wenn du auf einer Kopie arbeiten willst musst du das explizit angeben. Numpy-Arrays haben dazu eine copy-Methode.

Code: Alles auswählen

matrix1.copy()
MFG HerrHagen

Re: numpy.arrays in functionen

Verfasst: Montag 7. Juni 2010, 09:54
von nemomuk

Code: Alles auswählen

from numpy import array, ones
import copy

def arraytest(matrix1):
    matrix2 = copy.copy(matrix1)
    matrix2[:,0] = 20
    return matrix2
        
test_matrix = ones([4,2])
erg_matrix = arraytest(test_matrix)

print test_matrix
print erg_matrix
Edit: da war wohl einer schneller...

Re: numpy.arrays in functionen

Verfasst: Montag 7. Juni 2010, 09:59
von Pretender2k
geh ich dann also richtig in der Annahme, dass bei ints automatisch eine copy angelegt wird? Gibts denn dann ne moeglichkeit ints als referenz zu uebergeben? (ist jetzt zwar nicht so wichtig, aber waere doch interresant fuer mich).

Re: numpy.arrays in functionen

Verfasst: Montag 7. Juni 2010, 10:09
von BlackJack
@Pretender2k: Nein, auch bei `int`\s wird nichts kopiert sondern eine Referenz übergeben. Es ist *immer* der selbe Übergabemechanismus -- egal welchen Objekttyp man übergibt.

Man kann `int`\s halt bloss nicht verändern. Wäre ja auch komisch.

Re: numpy.arrays in functionen

Verfasst: Montag 7. Juni 2010, 10:15
von Darii
Pretender2k hat geschrieben:geh ich dann also richtig in der Annahme, dass bei ints automatisch eine copy angelegt wird?
Nein, es werden immer „Java-Referenzen“ übergeben.
Gibts denn dann ne moeglichkeit ints als referenz zu uebergeben?
Nein, Python kennt keine „C++-Referenzen“ (die Referenzen auf Variablen und nicht auf Objekte wie in Java/Python sind). Du kannst so etwas mit 1-elementigen Listen emulieren.

Was dich vielleicht verwirrt ist, dass du da zwei völlig verschiedene Operationen miteinander vergleichst.

Code: Alles auswählen

variable = ...
und

Code: Alles auswählen

variable[...] = ...
Beim ersten weist du der Variable einen neuen Wert zu, beim zweiten veränderst du das Objekt selbst.

Re: numpy.arrays in functionen

Verfasst: Montag 7. Juni 2010, 10:21
von BlackJack
@Darii: Ich würde ja wenn schon eher sagen bei Java werden "Python-Referenzen" übergeben. Ansonsten wäre nämlich die Frage was in den ersten 4 Jahren von Python's Existenz übergeben wurde -- Java gab's da nämlich noch nicht. ;-)

Re: numpy.arrays in functionen

Verfasst: Montag 7. Juni 2010, 10:37
von Pretender2k
ich seh schon, ist nen ganz nettes thema :) bin aber jetzt wunschlos gluecklich erstmal. Danke an alle fuer die Infos!