numpy.arrays in functionen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

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?
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

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
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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...
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

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).
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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Zuletzt geändert von Darii am Montag 7. Juni 2010, 10:21, insgesamt 1-mal geändert.
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. ;-)
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

ich seh schon, ist nen ganz nettes thema :) bin aber jetzt wunschlos gluecklich erstmal. Danke an alle fuer die Infos!
Antworten