Python: Keine Kontrolle über Referenz oder Kopie?


JuSchu85

Mitglied
Ich bringe mir gerad Python mit diesem eBook bei. Dort habe ich gelesen, dass bei Zuweisungen und Parameterübergaben zu Funkktionen und Methoden der Interpreter meistens selbst, je nach Rechenaufwand, entscheidet ob eine Kopie oder eine Referenz übergeben wird.

Ich muss sagen, dass es mich in machen Fällen schon zielich stört, dass man keine Kontrolle darüber hat. Zum Beispiel habe ich ein kleines Skript geschrieben um das Prinzip der "Observer" mal auszuprobieren.
Dabei meldet sich Objekt A bei Objekt B an, indem es sich selbst als Parameter übergibt um von Objekt B dann Nachrichten empfangen zu können. Damit das alles funktioniert muss sich das Objekt ja aber als Referenz und nicht als Kopie übergeben. Es geht hier ja um funktionale Objekte und nicht nur um irgendwelche Werte.
Falls doch eine Kopie von A übergeben wird, weil der Interpreter scheinbar entschieden hat, dass es in diesem Fall weniger Aufwand bedeutet, schickt B seine Nachrichten ja an ein völlig falsches Objekt und die Daten landen im Nirvana.
Oder hab ich da irgendwo einen Denkfehler? Weil mein Skript hat erst mal so funktioniert wie erwartet, aber ich mache mir halt sorgen, dass ich desswegen jetzt denke "Es läuft ja" nur weil der Interpreter in diesem Fall entschieden hat das Objekt als Referenz zu übergeben, es dann in einem anderen Fall später aber vielleich doch als Kopie tut und ich den Fehler nicht finde, weil ich dieses Problem schon längst abgeschlossen habe.

Also gibt es eine Möglichkeit den Interpreter explizit anzuweisen, dass Parameter (oder auch bei einfachen Zuweisungen) als Referenz und nicht als Kopie übergeben werden?

Ich kenne auch das Prinzip der Zeiger in C++ und das gefällt mir auch richtig gut. In Python kann man ja mit der Funktion id() eine Speicheradresse auslesen wie man es bei Zeigern auch machen würde. Gibt es auch ein Gegenstück zu id(), dass mir zu einer Speicheradresse die passende Referenz auf ein Objekt zurückgibt?
Dann könnte ich im Prinzip wie in C++ mit Zeigern arbeiten. Das währe finde ich noch die beste Lösung und man hätte die größte Kontrolle.
 

deepthroat

Erfahrenes Mitglied
Ich bringe mir gerad Python mit diesem eBook bei. Dort habe ich gelesen, dass bei Zuweisungen und Parameterübergaben zu Funkktionen und Methoden der Interpreter meistens selbst, je nach Rechenaufwand, entscheidet ob eine Kopie oder eine Referenz übergeben wird.
In welchem Abschnitt hast du das gelesen? Evtl. hast du da etwas mißverstanden.

Python verwendet ein Aufrufmodell namens call-by-object. :google:

Gruß
 

rd4eva

Erfahrenes Mitglied
Mich würde ja mal der Code interessieren. Vielleicht hängst du syntaktisch noch zu sehr in c++ und machst deswegen einen Denkfehler.
Ich hab mal schnell etwas zusammen gekritzelt :
Python:
class B:
	def __init__(self):
		print("Instance of class B created")
	def write(self,msg):
		print(msg)
	def identify(self):
		print(id(self))

		
class A:
	def __init__(self):
		print("Instance of class A created")
	def take(self,b):
		self.classB = b
	def use(self,msg):
		self.classB.write(msg)
	def useDirect(self,b,msg):
		print("Using Object : ",id(b))
		b.write(msg)		
	def identify(self):
		print(id(self))
	def identifyMember(self):
		print(id(self.classB))

cA = A()
#Instance of class A created
cB = B()
#Instance of class B created
cA.identify()
#44044528
id(cA)
#44044528
cB.identify()
#35326160
id(cB)
#35326160
cA.take(cB)
cA.identifyMember()
#35326160
cA.use("foobar")
#foobar
cA.useDirect(cB,"foobar")
#Using Object :  35326160
#foobar