Seite 1 von 2
Re: Slicing & Copy
Verfasst: Mittwoch 18. Januar 2012, 15:26
von snafu
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
Re: Slicing & Copy
Verfasst: Mittwoch 18. Januar 2012, 15:31
von jerch
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
Re: Slicing & Copy
Verfasst: Mittwoch 18. Januar 2012, 15:36
von snafu
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.
Re: Slicing & Copy
Verfasst: Mittwoch 18. Januar 2012, 16:08
von api
@snafu: Also bei ergibt das folgende Konstrukt aber ein "False"...
>>> "foo" is "f" + "o" + "o"
False
Re: Slicing & Copy
Verfasst: Mittwoch 18. Januar 2012, 16:44
von api
@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...

Re: Slicing & Copy
Verfasst: Mittwoch 18. Januar 2012, 17:03
von nomnom
CPython 2.7.2:
Pypy 2.7.1:
Re: Slicing & Copy
Verfasst: Mittwoch 18. Januar 2012, 17:06
von 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.
Re: Slicing & Copy
Verfasst: Mittwoch 18. Januar 2012, 23:33
von bords0
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").)
Re: Slicing & Copy
Verfasst: Donnerstag 19. Januar 2012, 13:31
von nomnom
Was für ein Compiler? Interpreter meinst du wohl …

Re: Slicing & Copy
Verfasst: Donnerstag 19. Januar 2012, 13:41
von Hyperion
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.
Re: Slicing & Copy
Verfasst: Donnerstag 19. Januar 2012, 17:12
von nomnom
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 …
Re: Slicing & Copy
Verfasst: Donnerstag 19. Januar 2012, 22:44
von bords0
@nomnom: Wenn es dir bewusst war, dass das beim Compilieren passiert, warum willst du dann, dass man Interpreter dazu sagt? Versteh ich nicht.
Re: Slicing & Copy
Verfasst: Donnerstag 19. Januar 2012, 23:28
von nomnom
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.