Speicherung von Variablen in Python, Expertenfrage?


15.01.2022, 23:02

Edit: Weil ja spezielle Module auf C (und C Pointer besitzt) aufbauen, könnte ich mir es so vorstellen...

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Ja, wird aber hier nicht Pointer sondern Referenz genannt.

Durch Zuweisungen mit = werden nicht die Objekte kopiert, sondern nur ihre Referenzen. Du hast dann zwei Namen für dasselbe Objekt.

pos+pygame.math.Vector2(0,0) erzeugt ein neues Objekt (mit den gleichen Koordinaten)

Schau dir mal die Doku (Stichwort copy, deep copy, shallow copy) an.

Dasselbe gilt auch für andere Objekte (hier Listen):

>>> a = [1,2,3,4]
>>> b=a
>>> b[2] = 17
>>> print(a)
[1, 2, 17, 4]

verreisterNutzer  15.01.2022, 23:11

Wow ich bin so gut xD

Danke!!!

Schachpapa  15.01.2022, 23:13
@verreisterNutzer

Auf diesen Zusammenhang stößt man aber eigentlich schon ziemlich am Anfang einer jeden Python-Karriere. Vgl. hinzugefügtes Codebeispiel

verreisterNutzer  15.01.2022, 23:14
@Schachpapa

Joa... ich komischerweise nicht xD

Eine Frage noch: in welchen Fällen kopiert man das Objekt und übergibt nicht die Speicheradresse. Also in welchen Fällen ist das von großer Notwendigkeit?

Schachpapa  15.01.2022, 23:23
@verreisterNutzer

Wenn du die Kopie verändern, aber das Original beibehalten willst.

Ich bin das erste Mal reingefallen als ich ein 2 dimensionales Array machen wollte:

>>> a = [0] * 5
>>> aa = [a] * 5
>>> print(aa)
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

Soweit so gut, aber dann:

>>> aa[0][1] = 1
>>> print(aa)
[[0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0]]

Das ist aber in Java nicht anders, obwohl es dort auch keine expliziten Pointer (und vor allem keine Pointerarithmetik) gibt.

verreisterNutzer  15.01.2022, 23:58
@Schachpapa

muss man sich in C++/C um die Referenzen selber kümmern, ist „normales“ übergeben von Variablen auch nur Referenzen oder in C++ 1:1 Kopie des Objektes?

Schachpapa  16.01.2022, 00:01
@verreisterNutzer

Mein C/C++ ist zu lange her (> 20 Jahre). Da musste man mit & und * herumzaubern, wenn man Referenzen meinte. Müsste ich mich wieder reinfuchsen.

Wenn du in Python ein Objekt an eine Funktion übergibst, wird dessen Referenz (als Wert) übermittelt. Das heißt, wenn das Objekt in der Funktion seinen Zustand ändert, dann gilt das auch für das Objekt außerhalb der Funktion.

class Person:
  def __init__(self, name):
    self.name = name

def change_name(person, name):
  person.name = name

tim = Person("Tim")
change_name(tim, "Tom")
print(tim.name) # Tom

Sobald du allerdings eine Zuweisung vornimmst, zeigt der Parameter auf ein neues Objekt. Das Objekt außen wird nicht mehr verändert.

class Person:
  def __init__(self, name):
    self.name = name

def change_name(person, name):
  person = Person(name)

tim = Person("Tim")
change_name(tim, "Tom")
print(tim.name) # Tim