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.
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.
und
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!