Seite 1 von 1

Identität id ändert sich beim erneuten Speichern

Verfasst: Sonntag 29. Oktober 2023, 12:31
von Lesnivila
Hallo,

bei folgendem Code ändert sich die Identität beim erneuten Speichern:

y = 2674
print (id(y))

Ich arbeite mit dem Android Python Editor Pydroid. Ich bin Anfängerin und lerne mit dem Rheinwerkbuch Python 3 und bin gerade beim Laufzeitmodell.

Ich hatte die Erklärung so verstanden, dass die Identität wie ein Fingerabdruck ist, der gleich bleibt. Vielen Dank für eure Hilfe.

Liebe Grüße

Lesnivila :D
(bedeutet Waldfee)

Re: Identität id ändert sich beim erneuten Speichern

Verfasst: Sonntag 29. Oktober 2023, 12:45
von __deets__
Das stimmt auch, ein Objekt hat über seine gesamte Lebenszeit immer die gleiche ID. Und hier kommt dein Missverständnis zum tragen: du denkst, das eine solche Zahl immer durch das gleiche Objekt repräsentiert wird. Das stimmt nicht. Stattdessen bekommst du (meistens, siehe unten) ein neues Objekt für den gleichen(!) Zahlwert. Das ist wie Hausnummern, es gibt viele, die gleich sind, aber es sind ja nicht dieselben. Gleichheit und Identität sind verwandt, es gilt immer (wenn nix pathologisch falsch programmiert wurde): wenn id(x) == id(y), dann folgt x == y. Aber umgekehrt gilt das nicht!

Für Zahlen gibt es tatsächlich bestimmte Optimierungen, ich weiß nicht genau welche Regeln da greifen, aber so +-100 werden die Zahl-Objekte dauerhaft vorgehalten und wiederverwendet. Einfach mal ein bisschen rumspielen.

Re: Identität id ändert sich beim erneuten Speichern

Verfasst: Sonntag 29. Oktober 2023, 13:19
von narpfel
https://docs.python.org/3/library/functions.html#id hat geschrieben:Return the “identity” of an object. This is an integer which is guaranteed to be unique and constant for this object during its lifetime. Two objects with non-overlapping lifetimes may have the same id() value.
Das sind die einzigen Garantien, die Python für `id` gibt. Insbesondere folgt daraus, dass es für Objekte mit nichtüberlappenden Lebenszeiten (was natürlich der Fall ist, wenn man zwei verschiedene Instanzen vom Interpreter startet) gar keine Garantien gibt.

Wenn deine Erklärung was anderes sagt, dann ist die falsch. Wäre nicht das erste Mal, dass Rheinwerk-Bücher nicht so gut sind.

Re: Identität id ändert sich beim erneuten Speichern

Verfasst: Sonntag 29. Oktober 2023, 15:40
von Lesnivila
Hallo deets und narpfel,

vielen Dank für eure Hilfe. Ja, Rheinwerk spricht davon, dass es wie ein einzigartiger Fingerabdruck gleich bleibt. Ich habe auch manchmal das Gefühl, dass Rheinwerk am Anfang zu komplizierte Beispiele bringt. So hatte ich in den Anfangskapiteln schon einen Code um die Farbtiefe und Bildabmessungen aus einer bmp Datei auszulesen, nur dass doch nicht alles erklärt wurde. Unter anderem eine bitweise Linksverschiebung um 8 bit war dabei, die noch gar nicht durchgenommen war. Ich habe den Code mir dann von der Chat GPT erklären lassen.

Wo habt ihr Python gelernt, bitte? python.org oder w3schools.com?

Danke!
Liebe Grüße
Lesnivila

Re: Identität id ändert sich beim erneuten Speichern

Verfasst: Sonntag 29. Oktober 2023, 17:38
von __blackjack__
@Lesnivila: Der Vergleich mit dem Fingerabdruck ist IMHO irreführend, weil die Fingerabdrücke von allen Menschen, lebend oder tot, unterschiedlich sind. Die `id()` von Objekten ist aber nur zur Lebzeit der Objekte unterschiedlich. Wenn ein Objekt ”stirbt” kann dessen `id()` durchaus wiederverwendet werden.

Code: Alles auswählen

a = [1, 2, 3]
i = id(a)
a = None  # Die Liste kann ab jetzt aufhören zu existieren.
a = "Hallo"
print(i == id(a))  # Das hier *kann* durchaus `True` ausgeben.
Falls sie das nicht in einer späteren Ausgabe überarbeitet haben (meine Ausgabe ist noch bei Galileo Press erschienen), sollte beim zweiten `seek()` das zweite Argument auch nicht als magische 1 angegeben werden, sondern als verständliche(re) Konstante `os.SEEK_CUR`. Ist als Abkürzung natürlich auch nicht so schön, aber immerhin kann man danach besser suchen, wenn man wissen möchte was das bedeutet.

Man sollte keine einbuchstabigen Namen verwenden wenn man da problemlos sinnvollere, verständlichere schreiben kann. Zudem sollte man beim öffnen von Dateien wo das möglich ist, die ``with``-Anweisung verwenden.

Letztlich ist die Funktion auch viel zu umständlich, denn es gibt `int.from_bytes()`:

Code: Alles auswählen

#!/usr/bin/env python3
import os


def bytes2int(values):
    return int.from_bytes(values, "little")


def main():
    with open("test.bmp", "rb") as file:
        file.seek(18)
        print("Breite:", bytes2int(file.read(4)), "px")
        print("Höhe:", bytes2int(file.read(4)), "px")
        file.seek(2, os.SEEK_CUR)
        print("Farbtiefe:", bytes2int(file.read(2)), "bpp")


if __name__ == "__main__":
    main()
In einem echten Programm hätte ich den zweiten `seek()`-Aufruf auch mit einer absoluten Position geschrieben. Sonst muss man den gesamten Code davor lesen was der mit dem Dateizeiger anstellt, um herauszufinden an welcher absoluten Position dann gelesen wird, und das ist auch beim schreiben des Programms weniger fehleranfällig.

Ich hatte mit dem Tutorial in der Python-Dokumentation angefangen.

Re: Identität id ändert sich beim erneuten Speichern

Verfasst: Montag 30. Oktober 2023, 12:42
von Lesnivila
Vielen herzlichen Dank für deine Hilfe!