Die Liste, die sich selbst enthält
>>> a=["a","b","c"]
>>> b=[None,a]
>>> print b
[None, ['a', 'b', 'c']]
>>> b[0]=b
>>> print b
[[...], ['a', 'b', 'c']]
>>>
Gefällt mir.
Vor allem die Darstellung [...]
Wer weiß, was sich dahinter verbirgt?
Und ist [...] überhaupt richtig?
>>> b=[None,a]
>>> print b
[None, ['a', 'b', 'c']]
>>> b[0]=b
>>> print b
[[...], ['a', 'b', 'c']]
>>>
Gefällt mir.
Vor allem die Darstellung [...]
Wer weiß, was sich dahinter verbirgt?
Und ist [...] überhaupt richtig?
steppenhund - 8. Sep, 22:18
Die Eigenschulung
In der Folge gebe ich eine kleine Demo, wie ich mich selbst schule. (Dass mir das Spass macht, ist wohl ersichtlich.)
Indem ich so verbalisiere, behalte ich die Inhalte auch ohne Nachschlagen im Gedächtnis.
Eine kleine weiterführende Demo, die ich gerne einmal als Schulung gehabt hätte:)
>>> a=[10,20,30,40]
>>> print a
[10, 20, 30, 40]
- logisch
>>> print a[:-1]
[10, 20, 30]
- das ist eine Konvention, der Slice mit dem Doppelpunkt schneidet die Lister heraus vom Anfang (fehlendes Argument) bis exklusive dem letzten.
>>> print a[-1]
40
- das letzte Argument ist der erwartete Wert 40.
- und jetzt zum Kopieren. Eine Liste ist ein komplexes Objekt, daher wird normalerweise nur eine Pointer-Referenz ein zweites Mal angelegt:
>>> b=a
Beweis: in b wird etwas geändert. In a ändert sich der betreffende Eintrag mit
>>> b[2]=200
>>> print b
[10, 20, 200, 40]
>>> print a
Jetzt kopieren wir: die neue Liste c bekommt die Zuweisung Slice vom ersten bis zum letzten Element. Die werden alle als Werte übergeben und bilden nun eine neue Liste.
>>> c=a[:]
>>> print c
[10, 20, 200, 40]
genau wie a vorher war.
Jetzt ändern wir das erste Element von c
>>> c[0]=1000
>>> print c
[1000, 20, 200, 40]
c ist geändert
>>> print b
[10, 20, 200, 40]
b ist nicht geändert
>>> print a
[10, 20, 200, 40]
und a auch nicht.
Das ist eine einfache Lösung des Kopieren, welche aber nur für Listen gilt. Für geschlüsselte Listen, also Dictionaries, benötigt man den copy-Modul, der sich mit
import copy
leicht der Arbeitsumgebung hinzufügen lässt.
sei h ein dictionary wie z.B. h{"key1":"Wert1", "key2":Wert2"}
so benötigt man für eine Kopie den Befehl:
cloneOfH=copy.deepcopy(h)
damit hat man dann zwei voll entkoppelte dictionaries, deren Werte getrennt bearbeitet werden können.
Dieses Cloning funktionert auch für allgemeine Objekte.
In Java sieht das ein bisschen anders aus:
Es gibt die clone() Method.
In Java, the way to make an identical copy of an object is to invoke clone() on that object. When you invoke clone(), it should either:
1. return an Object reference to a copy of the object upon which it is invoked, or
2. throw CloneNotSupportedException
Because clone() is declared in class Object, it is inherited by every Java object. Object's implementation of clone() does one of two things, depending upon whether or not the object implements the Cloneable interface. If the object doesn't implement the Cloneable interface, Object's implementation of clone() throws a CloneNotSupportedException. Otherwise, it creates a new instance of the object, with all the fields initialized to values identical to the object being cloned, and returns a reference to the new object.
The Cloneable interface doesn't have any members. It is an empty interface, used only to indicate cloning is supported by a class. Class Object doesn't implement Cloneable. To enable cloning on a class of objects, the class of the object itself, or one of its superclasses other than Object, must implement the Cloneable interface.
Im Prinzip muss man selbst programmieren, wie sich das Object klonen lässt. Ob man dazu ein Framework benützt oder über Serialization oder Reflection generisch vorgeht, ist Geschmacksfrage.
Mir kommt es jedenfalls in Java komplizierter vor.