Objekt / Name / Wert Problem

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

DER BEITRAG WAR VON ThomTabeus - DICKE FINGER GEHABT!

Hallo Community!

Ich habe vor kurzem begonnen, Python zu lernen (... möchte dies irgendwann beruflich nutzen) und nutze hierbei, als einen ersten Einstieg, das Buch "Python 3 - Lernen und professionell anwenden - Das umfassende Praxisbuch". In einem Einstiegskapitel geht es um Objekte, Werte und Namen, wobei ich gerade auf ein Verständnisproblem stosse... villeicht kann jemand helfen:
Wenn ich (in der Shell (3.7.3)) mittels "zzz='Test'" ein Objekt mit dem Wert "Test" und dem Namen "zzz" erzeuge, wird diesem automatisch ein "Typ" zugeordnet...
>>> type (zzz)
liefert:
<class 'str'>

>>> type (id('zzz'))
liefert hingegen
<class 'int'>

Verstehe ich es richtig, dass nun ein Objekt existiert, welches über eine "Integer-Zahl" identifizierbar ist (also der eigentliche Objekt-Typ ist integer), welches aber auch gleichzeitig mit einem String-Namen ('zzz') assoziiert ist und welches weiter, nun einen String-Wert ("Test") besitzt? Mit " type (zzz)" ermittle ich also den assoziierten Namen (den String) und mit "type (id('zzz'))" die Art des integer-Identifiers des Objektes???

Vielen Dank für jegliche Hilfe!!!
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ThomTabeus: Nein, der Typ von dem Objekt das an den Namen `zzz` ist `str`. Mit `id()` kann man eine zu diesem Zeitpunkt eindeutige Zahl zu einem Objekt ermitteln. Diese Zahl hat den Typ `int`. Das Objekt behält diese Zahl als ID solange es existiert. Wenn es nicht mehr existiert, kann diese Zahl aber auch ein anderes Objekt bekommen. Und es gibt auch nirgends eine von der Programmiersprache garantierte Zuordnung von ID-Zahlen zu Objekten. Du kannst also nicht eine ID nehmen und irgendwo das dazugehörige Objekt erfragen falls es das gibt.

Mit ``type(zzz)`` ermittelst Du nicht den Namen sondern den Typ. Und mit ``type(id('zzz'))`` ermittels Du den Typ der ID der Zeichenkette "zzz". Die übrigends nichts mit "Test" oder dem Namen `zzz` zu tun hat.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
ThomThabeus
User
Beiträge: 2
Registriert: Montag 2. Dezember 2019, 22:15

Hallo blackjack, ich danke für die schnelle Antwort! Ich bin mir aber nicht sicher, ob ich das alles richtig verstanden habe... ich habe eine "Verständnis-Grafik" ;))) gebastelt; vielleicht könntest Du einmal draufschauen und mir sagen, ob dies so stimmt (https://snipboard.io/TyrQYh.jpg)... was ich definitv noch nicht verstanden habe, ist, welchen Vorteil es bringt, wenn ich so vorgehe... ich erzeuge ein Objekt mit einem Wert (dieser Wert definiert mein Objekt) und assoziiere dieses Objekt anschließend mit Namen (...oder auch verschiedensten anderen Dingen wie z.B. Methoden oder Funtk(richtig???)). Mir ist (gerade noch) nicht verständlich, worin der Vorteil liegt... mit >>>a=1 und >>>b=1 erzeuge ich ein einzelnes Objekt, welches mit zwei Namen assoziiert ist... wäre es nicht wesentlich übersichtlicher, nach dem "Variablen>Wert"-System zwei Objekte (oder Variablen) mit jeweils dem Wert 1 zu managen??? Was passiert, wenn ich >>>b=2 setze? Wird dann die Assoziation des Namens "b" mit dem Objekt mit dem Wert 1 gelöscht und es wird ein neues Objekt mit dem Wert 2 erzeugt??
Danke Dir für Deine Hilfe, viele Grüße, TomThab!!!
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

ThomThabeus hat geschrieben: Mittwoch 4. Dezember 2019, 22:52 Was passiert, wenn ich >>>b=2 setze? Wird dann die Assoziation des Namens "b" mit dem Objekt mit dem Wert 1 gelöscht und es wird ein neues Objekt mit dem Wert 2 erzeugt??
Korrekt. Es sei denn ein Objekt mit dem Wert 2 existiert schon, dann wird der Name an das existierende Objekt gebunden.

Lesetipp: Facts and myths about Python names and values
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ThomThabeus: Was meinst Du mit ”übersichtlicher”? Wobei das im Grunde auch ein Implementierungsdetail ist das die Python-Implementierung die Du da verwendest *nicht* zwei `int`-Objekte mit dem Wert 1 erzeugt. Das kann auch anders aussehen:

Code: Alles auswählen

In [34]: a                                                                      
Out[34]: 4711

In [35]: b                                                                      
Out[35]: 4711

In [36]: a == b                                                                 
Out[36]: True

In [37]: a is b                                                                 
Out[37]: False

In [38]: id(a)                                                                  
Out[38]: 140693779722288

In [39]: id(b)                                                                  
Out[39]: 140693779452304
Bei CPython werden kleine ganze Zahlen nur einmal erzeugt und dann immer diese Objekte verwendet, während für grosse Zahlen tatsächlich neue Objekte angelegt werden, auch wenn es schon irgendwo ein Objekt mit dem gleichen Wert gibt. Für die Grenze zwischen kleine/grosse Zahl müsstest Du in den CPython-Quelltext schauen. Das ist aber letztlich nicht wirklich relevant für's programmieren, denn bei nicht veränderbaren Objekten macht es keinen Unterschied ob man das selbe Objekt oder eines mit dem gleichen Wert vor sich hat. Die Objektidentität ist der einzige Punkt an dem man den Unterschied sehen kann, ansonsten verhalten sich die Objekte in beiden Situationen gleich.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
ThomThabeus
User
Beiträge: 2
Registriert: Montag 2. Dezember 2019, 22:15

Super, danke für Deine Hilfe, blackjack!!!
Antworten