veränderlich und unveränderlich - kleine Frage

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
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hallo,

Strings und Zahlen gelten als unverändlich, d.h. man kann nur deren Variablennamen ändern, aber nicht deren Werte.

z.B.

Code: Alles auswählen

mein_Lehrer = "Herr Dumm"
mein_Lehrer = "Herr Pflaume"
Da wird nur der Name geändert, bzw."Herr Pflaume" dem Etikett mein_Lehrer zugewiesen. Dabei wird "Herr Dumm" praktisch aus dem Speicher gelöscht.

noch ein anderes Beispiel:

Code: Alles auswählen

mein_Lehrer = "Herr Wolf"
neuer_Lehrer = mein_Lehrer
Nun hat der String "Herr Wolf" zwei Etikette, nämlich mein_Lehrer und neuer_Lehrer. Das bedeutet jetzt, dass die zwei Etikette (Variablennamen) einen Wert haben, nämlich "Herr Wolf", aber nicht zwei!

Beispiel für eine veränderliche Liste:

Code: Alles auswählen

liste = ['a', 'd', 'b']
liste.sort()
Man kann die Reihenfolge ändern, Indizes löschen usw.

D.h. jetzt für Strings, dass es unmöglich ist, den Wert in gewisser Maßen zu ändern? Und sind meine "Erklärungen" korrekt? Denn so habe ich es bisher verstanden.

Etikett ist ein Name, um genauer zu sein ein Variablenname. Für mich ist dieser Begriff leichter :)
BlackJack

@Gary123456: Deine Ausführungen stimmen so weit.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Mir hat es sehr geholfen, mich von vielen Begriffen aus anderen Programmiersprachen zu trennen:

Es gibt Namen und es gibt Objekte. Bei OOP kommen noch Attribute hinzu. That's it.

Auch den Begriff "Variable" finde ich eher unpassend.

Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hi,

@BlackJack) Danke!

@bwbg)
Auch den Begriff "Variable" finde ich eher unpassend.
So stehts in meinem Buch auch. Nur hat der Guido van Rossum es selber als Variable deklariert. In meinem Buch stehts halt so drinne, dass man das selber entscheiden soll. Beide Begriffe sind richtig :) (Stand so ähnlich im Buch)

Jetzt gehts zum wichtigsten Thema: Datenstrukturen :)

Und:

psssssst: 1:0 für Bayern
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Variable würde ich eher so wie C ansehen, also Platz im Speicher sehen, in dem man Daten reinschreiben kann. Das macht Python völlig anders.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Gary123456 hat geschrieben:

Code: Alles auswählen

mein_Lehrer = "Herr Dumm"
mein_Lehrer = "Herr Pflaume"
Da wird nur der Name geändert, bzw."Herr Pflaume" dem Etikett mein_Lehrer zugewiesen. Dabei wird "Herr Dumm" praktisch aus dem Speicher gelöscht.
Exakter müsste man es anders formulieren: Herr Pflaume bekommt in Zeile 2 das Etikett, welches vorher an Herrn Dumm klebte. Herr Dumm wird erst dann gelöscht, wenn keine weiteren Etiketten mehr an ihm kleben. Wenn man nämlich mal annimmt, dass Herr Dumm vorher auch noch das Etikett "neuer_lehrer" drangeklebt bekommen hätte, dann würde Herr Dumm auch nach der Etikettenübergabe an Herrn Pflaume noch weiter existieren, da ja noch ein anderes Etikett bei Herrn Dumm übrig geblieben wäre.

Es ist zudem wichtig zu verstehen, dass es keine herumschwirrenden Etiketten gibt, an die man irgendwelche Sachen packen kann, sondern dass es genau umgekehrt ist: Etiketten sind Namen / Variablen / was-auch-immer, die quasi aus dem Nichts erstellt werden, sobald man eine Zuweisung macht (`mein_Lehrer = "Herr Dumm"`).¹ Und Objekte sind wie Pakete, an denen diese Etiketten drangeklebt werden können. Wenn du sagst, dass Herr Pflaume dem Etikett xy zugwiesen wird, dann kann das also zu Missverständnissen führen. Man könnte da IMHO denken, dass ein Etikett mehrere Objekte gleichzeitig verwalten kann, was aber wie gesagt nicht zutrifft: Ein Etikett kann immer nur an exakt *einem* Paket kleben.

__________

¹ "aus dem Nichts" trifft genau genommen nur dann zu, wenn es zuvor (im entsprechenden Sichtbarkeitsbereich) noch keine Zuweisung an diesen Namen gab. Andernfalls wird dem vorherigen Paket der Aufkleber mit diesem Namen weggenommen. Es passiert dann eben das, was du mit dem o.g. Beispiel schon gezeigt hast.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nochmal bezüglich "Zuweisung": Dieser Begriff wird häufig benutzt, wenn man eigentlich "wird definiert als" meint. Man kann einem Objekt einen (weiteren) Namen zuweisen (mehr im Sinne von Alias), aber den Namen kann man höchstens neu definieren. Ich will jetzt aber auch nicht als Sprach-Nazi gelten (zumal es sich um einen in der Informatik etablierten Begriff handelt). Mir kam das nur in den Sinn, nachdem ich schon im vorherigen Beitrag so pingelig auf die Ausdrucksweise geachtet hatte - wenn schon, denn schon. ;P
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hi,

uch , so viele Antworten - dann beginn ich mal zu schreiben.

@Leonidas)

Wie macht das Python eigentlich? Wenn man einem Wert einem Namen zuweist (z.B. test = "String") dann wird für diese Variable test Speicher reserviert. Wie sind denn da die Unterschiede zu C? Und noch paar Wissensfragen: Je größer der String, desto größer müsste doch dann auch die Speicherauslastung sein. Sprich es werden paar mehr Bits/ Bytes verbraucht als ein kurzer String, sehe ich das richtig? Das managed dann Python alleine, oder wie? Und auch die verschiedenen Datentypen bräuchten eine verschiedene Speicherreservierung, oder nicht?

@snafu)
Exakter müsste man es anders formulieren: Herr Pflaume bekommt in Zeile 2 das Etikett, welches vorher an Herrn Dumm klebte. Herr Dumm wird erst dann gelöscht, wenn keine weiteren Etiketten mehr an ihm kleben. Wenn man nämlich mal annimmt, dass Herr Dumm vorher auch noch das Etikett "neuer_lehrer" drangeklebt bekommen hätte, dann würde Herr Dumm auch nach der Etikettenübergabe an Herrn Pflaume noch weiter existieren, da ja noch ein anderes Etikett bei Herrn Dumm übrig geblieben wäre.
Genau.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ja, wenn der String länger ist, dann wird auch mehr Speicher verbraucht. Ansonsten würde es ja eine Maximalgröße für Strings geben und Python müsste theoretisch immer Speicher in dieser Maximalgröße vom Betriebssystem anfordern, was wohl reichlich dämlich wäre. Ähnlich verhält es sich natürlich auch mit Listen usw. Wenn neue Elemente hinzugefügt werden, dann wachsen die auch entsprechend an.

Meistens ist der Speicherverbrauch aber nichts, worauf man wirklich achten müsste. Erst wenn man es mit relativ großen Datenmengen zu tun bekommt (oftmals wurden diese dann außerhalb von Python erstellt und/oder in irgendwelche Dateien geschrieben), dann sollte man sich darüber Gedanken machen. Für dein Frage-Antwort-Spiel musst du dich darum aber ganz bestimmt nicht kümmern. ;)

EDIT: Bezüglich des Speichermanagements liegst du richtig: Darum kümmert sich Python komplett selbst. Sowohl um das Anfordern der für den Typen passenden Speichermenge, als auch um das Anfordern von weiterem Speicher bei dynamisch wachsenden Typen wie z.B. Listen. Und nicht zu vergessen wird der Speicher auch wieder durch Python freigegeben, wenn er nicht mehr benötigt wird. "Nicht mehr benötigt" meint quasi, dass kein Etikett mehr am Objekt klebt und es somit nicht mehr erreichbar ist. Das bedeutet somit, dass es "zum Abschuss" freigegeben ist.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

EDIT: Bezüglich des Speichermanagements liegst du richtig: Darum kümmert sich Pyhton komplett selbst. Sowohl um das Anfordern der für den Typen passenden Speichermenge, als auch um das Anfordern von weiterem Speicher bei dynamisch wachsenden Typen wie z.B. Listen. Und nicht zu vergessen wird der Speicher auch wieder durch Python freigegeben, wenn er nicht mehr benötigt wird. "Nicht mehr benötigt" meint quasi, dass kein Etikett mehr am Objekt klebt und es somit nicht mehr erreichbar ist. Das bedeutet somit, dass es "zum Abschuss" freigegeben ist.
Cool :) Das habe ich vorher einfach nicht genau verstanden :) Jetzt habe ich mal wenigstens verstanden, wie das mit der Speicherreservierung aussieht :) Danke!
BlackJack

@Gary123456: Eine Variable besteht aus einem Namen, einen Wert, einem Typ, und einem Speicherbereich. In Python gehören Typ und Speicher zum Wert. Man kann also an einen Namen (nacheinander) verschiedene Werte mit unterschiedlichen Typen zuweisen die an unterschiedlichen Stellen im Speicher liegen. In C dagegen gehören Typ und Speicher zum Namen. Wenn man einem Namen einen Wert zweist, dann muss der immer vom passenden Typ sein, der zu dem Namen gehört, und er wird in dem Speicherbereich abgelegt, der für diesen Namen reserviert ist.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Also daher müssen Vriablen immer mit den Typ deklariert werden wie z.B. int i ?

Vielen Dank!
BlackJack

@Gary123456: Genau. Bei ``int i`` wird in C der Typ von `i` festgelegt und Speicher reserviert in den ein Wert vom Typ ``int`` hinein passt. Bei einem 32-Bit-Betriebssystem zum Beispiel vier Bytes.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Gary123456 hat geschrieben:Also daher müssen Vriablen immer mit den Typ deklariert werden wie z.B. int i ?
In C ja, weil das sagt "reserviere 4 Bytes auf dem Stack und sehe sie als Ganzzahl mit Vorzeichen an". "float i" wäre dann "reserviere 4 Bytes auf dem Stack" und sehe sie im folgenden als Fließkommazahl an.
Gary123456 hat geschrieben:Wie macht das Python eigentlich? Wenn man einem Wert einem Namen zuweist (z.B. test = "String") dann wird für diese Variable test Speicher reserviert. Wie sind denn da die Unterschiede zu C?
Ein ähnliches Verhalten kannst du mit C auch erziehlen, mittels Pointern:

Code: Alles auswählen

int num = 42;
int* a = #
int* b = #

printf("a = %d, b = %d\n", a, b);
Das heißt du allozierst erstmal eine Variable `num` (was dann "String" entsprechen würde), und dann machst du zwei Referenzen, `a` und `b`, die dann `test` entsprechen würden. Die genauen Details wie Python das macht sind noch wesentlich komplexer, weil Python das wesentlich komplexer macht weil man ein Python-Objekt erstmal erstellen muss und man muss auch noch die Information über die Referenzen an der Garbage Collector weitergeben und außerdem muss man die Namen auch in den Dict-Objekten eintragen, damit man auf die Elemente aus Python aus zugreifen kann.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

@Leonidas)

OK!
Antworten