echte Kopie einer Sequenz mit "[:]"

05/07/2009 - 16:23 von Michael Hentsch | Report spam
Hallo zusammen,

ich lese gerade das "Python"-Buch von Galileo Computing (openbook).
Darin wird in Abschnitt 8.5
(http://openbook.galileocomputing.de...08_005.htm)
beschrieben, wie eine "echte" Kopie einer Instanz erstellt werden kann.

Das Beispiel beschreibt den Unterschied zwischen:




s1 = "Kopier mich!"
s2 = s1
s1 == s2






True



s1 is s2






True

und:




s1 = "Kopier mich!"
s2 = s1[:]
s1 == s2






True



s1 is s2






False

Das klingt für mich logisch und nachvollziehbar.

Versuche ich aber, dies in der Python-Shell nachzustellen, so bekomme
ich ein anderes Ergebnis:

Python 2.5.4 (r254:67916, Jul 4 2009, 19:01:42)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.



s1 = "Mein Versuch"
s2 = s1
s1 == s2






True



s1 is s2






True

Soweit OK, aber:

Python 2.5.4 (r254:67916, Jul 4 2009, 19:01:42)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.



s1 = "Mein Versuch, Kopie"
s2 = s1[:]
s1 == s2






True



s1 is s2






True



id(s1)






3084047760L



id(s2)






3084047760L

Ich hàtte eine "echte Kopie" erwartet, erhalte aber nur eine weitere
Referenz auf dieselbe Instanz.

Wo liegt hier der Haken? Mache ich einen Denkfehler?

Viele Grüße

Michi
 

Lesen sie die antworten

#1 Marek Kubica
05/07/2009 - 17:04 | Warnen spam
On Sun, 05 Jul 2009 16:23:11 +0200
Michael Hentsch wrote:

ich lese gerade das "Python"-Buch von Galileo Computing (openbook).
Darin wird in Abschnitt 8.5
(http://openbook.galileocomputing.de...08_005.htm)
beschrieben, wie eine "echte" Kopie einer Instanz erstellt werden
kann.



Achtung, das Buch wurde von Leuten geschireben, die nicht wirklich
Ahnung von Python haben, daher mit Vorsicht zu verwenden.

Ich hàtte eine "echte Kopie" erwartet, erhalte aber nur eine weitere
Referenz auf dieselbe Instanz.

Wo liegt hier der Haken? Mache ich einen Denkfehler?



Der "Fehler" den du hier hast liegt darin begründet, dass CPython bei
[:] auf Strings keine Kopie sondern das gleiche Objekt zurückliefert,
im Gegensatz zu Listen.

Die Begründung ist eine Optimierung, da Strings sowieso unverànderlich
sind, macht es keinen Sinn den String zu kopieren, da er sich sowieso
nicht àndern kann.

Siehe:

liste = [1, 2, 3]
lref = liste
lcopy = liste[:]
liste.append(4)
print liste, lref, lcopy

-vs-

strval = "Hallo"
sref = strval
scopy = strval[:]
strval = "Welt!"
print strval, sref, scopy

grüße,
Marek

Ähnliche fragen