Slicing & Copy

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.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hab hier noch sowas:

Code: Alles auswählen

>>> result = ""
>>> for char in "foo":
...     result += char
... 
>>> result is "foo"
False
>>> result
'foo'
>>> result = "foo" # Neuzuweisung
>>> result is "foo"
True
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Und weiter gehts:

Code: Alles auswählen

>>> a='abc'
>>> b='abc'
>>> a is b
True
>>> a='a bc'
>>> b='a bc'
>>> a is b
False
>>> a='abc'
>>> b='abc'
>>> a is b
True
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Gibt es da ein bestimmtes System hinter oder sollte man mit dem Vergleich auf Objektidentität wirklich sehr sehr vorsichtig umgehen? Es ist ja ohnehin klar, dass Vergleiche vornehmlich über den Wert gemacht werden sollten und nicht über die Identität, weil's halt etwas ganz anderes ist, was manchmal nur zufällig übereinstimmt.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@snafu: Also bei ergibt das folgende Konstrukt aber ein "False"...
>>> "foo" is "f" + "o" + "o"
False
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@snafu: Ich muss mich korrigieren. Es gibt Unterschiede zwischen Python 2.x und 3.x (ok, natürlich, aber ich meine diesen speziellen Fall jetzt...)

Python 2:
>>> "foo" is "f" + "o" + "o"
False
Python 3:
>>> "foo" is "f" + "o" + "o"
True
Es sieht so aus, als ob Python3 noch etwas mehr optimiert... :)
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

CPython 2.7.2:

Code: Alles auswählen

>>> "foo" is "f"+"o"+"o"
True
Pypy 2.7.1:

Code: Alles auswählen

>>>> "foo" is "f"+"o"+"o"
True
BlackJack

@snafu: Innerhalb einer Python-Implementierung und Version gibt es da sicher ein System hinter, aber es ist eben implementierungsabhängig und etwas worauf man sich nicht verlassen kann. Mein letztes `id()`-Beispiel würde unter Jython zum Beispiel `False` ergeben, weil die IDs dort anders zustande kommen als bei CPython. Das gleiche gilt bei der Frage unter welchen Umständen gleiche Zeichenketten auch die selben Zeichenketten sind.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

In der Doku steht die Funktion "intern" erklärt: http://docs.python.org/library/function ... ern#intern. Nur Python < 3.0.

("f" + "o" + "o" wird übrigens schon vom Compiler zum Literal "foo" optimiert (je nach Python-Version), deshalb kommt etwa anderes heraus als bei "".join("foo").)
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Was für ein Compiler? Interpreter meinst du wohl … ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

nomnom hat geschrieben:Was für ein Compiler? Interpreter meinst du wohl … ;)
Vorsicht! Python hat natürlich auch eine Compiler-Komponente - denn der Interpreter liest und versteht lediglich speziellen Bytecode. Man spricht idR. einfach vom Python-"Interpreter", wenn man ein Python-Programm ausführen möchte. Intern wird dieses vor dem eigentlichen Abarbeiten (="interpretieren") in Bytecode übersetzt. Tatsächlich ist also anzunehmen, dass die Compiler-Komponente an dieser Stelle optimiert und optimierten Bytecode erzeugt, der dann von der eigentlichen Interpreter-Komponente ausgeführt wird.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Hyperion hat geschrieben:Vorsicht! Python hat natürlich auch eine Compiler-Komponente - denn der Interpreter liest und versteht lediglich speziellen Bytecode. Man spricht idR. einfach vom Python-"Interpreter", wenn man ein Python-Programm ausführen möchte. Intern wird dieses vor dem eigentlichen Abarbeiten (="interpretieren") in Bytecode übersetzt. Tatsächlich ist also anzunehmen, dass die Compiler-Komponente an dieser Stelle optimiert und optimierten Bytecode erzeugt, der dann von der eigentlichen Interpreter-Komponente ausgeführt wird.
Das war mir beim Schreiben auch bewusst, aber bei Python „vom Compiler“ zu sprechen war mir nicht spezifisch genug …
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

@nomnom: Wenn es dir bewusst war, dass das beim Compilieren passiert, warum willst du dann, dass man Interpreter dazu sagt? Versteh ich nicht.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

bords0 hat geschrieben:@nomnom: Wenn es dir bewusst war, dass das beim Compilieren passiert, warum willst du dann, dass man Interpreter dazu sagt? Versteh ich nicht.
Das habe ich nie behauptet. Allerdings war es mir klar, dass der Interpreter auch erstmal das Programm zu Bytecode kompiliert.
Antworten