[>>]

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?
virtualmono - 9. Sep, 00:10

Hmm... in der Theorie hast Du eine rekursive Liste erstellt. In der Praxis kann man aber nur die Elemente -2, -1, 0 und 1 abfragen, wobei b[-2]=b[0]=b und b[-1]=b[1]=a sind.

steppenhund - 9. Sep, 01:04

Das ist ziemlich gut. Eigentlich sollte der print-Befehl herum grummeln und irgendwann einen stack-overflow melden. Statt dessen gibt es einen netten formalen Hinweis auf Nicht-Darstelllbarkeit. Elegant, oder?
virtualmono - 9. Sep, 02:45

Wobei es mich sowieso wundert, daß print b[-2] funktioniert - sollten hier normalerweise nicht nur 0 und positive Indizes erlaubt sein *grübel*?
steppenhund - 9. Sep, 08:14

Ach das ist eine sehr praktische Feinheit. Die Minus-Indizes adressieren die Elemente vom letzten zum ersten. Sehr, sehr praktisch. Es erspart einem die Abfrage der Länge.
steppenhund - 9. Sep, 11:21

Die Eigenschulung

"Es" ist auf Mac installiert, ich muss es aber leider für den Kunden auf MS verwenden, allerdings mit dem Hoffnungsschimmer, dass es ja auch auf Unix/Linux laufen soll.

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.
PeZwo - 9. Sep, 08:57

Was ist das für eine Sprache bzw. Environment?

steppenhund - 9. Sep, 09:40

Environment: irgendein Betriebssystem. Die Sprache läuft praktisch überall.
Welche es ist, wirst Du leicht herausfinden. Das war ja implizit Teil der Fragestellung. Da die Sprache aus unterschiedlichsten Sprachstämmen Anleihen nimmt, könnte man sie fast als Esperanto bezeichnen:)
RokkerMur - 9. Sep, 09:50

Danke, wollte ich auch fragen ;)
virtualmono - 9. Sep, 09:53

Ein Tip: Auf dem Mac ist es bereits vorinstalliert, bei Windows natürlich nicht ;-)
RokkerMur - 9. Sep, 16:46

Dafür ist bei windows Vista ;]
PeZwo - 9. Sep, 16:56

mich erinnert die Sprachkonstrukte an C... aber durch meine jahrelange Arbeit im SAP-Bereich habe ich den Kontakt zu den aktuellen Sprachen am PC mehr oder minder verloren. Daher weiß ich es nicht um welche Sprache es sich handelt. Aber ich kann den Quelltext problemlos interpretieren.
steppenhund - 9. Sep, 19:23

Das ist doch schon was.
Es handelt sich um Python.
PeZwo - 10. Sep, 06:13

Aha. Ich gebe es zu... Python sagt mir absolut nichts. Zumindest im IT-Bereich :))
virtualmono - 10. Sep, 22:36

Ich kannte es auch nur aus der ESRI-Welt, bevor der Herr Steppenhund damit angefangen hat - und da haben wir bislang auch eher mit VB gearbeitet. Aber es ist schon erstaunlich, was damit alles geht ;-)
steppenhund - 10. Sep, 23:58

Also meine Laufbahn mit Skriptsprachen ist ja folgende:
  • sh (mit sed, grep und awk im Gespann)
  • csh
  • Irgendwann dann das komische DOS.Bat mit einer absolut komischen %-Syntax
  • REXX, eine super Sprache, hatte assoziative Arrays, lief unter OS/2 und Windows, es gab dann später ein NetRexx und ein ObjRexx. Das beste war aber, dass es bei OS/2 Libraries für C oder C++ gab, mit denen man fast jedes Programm über REXX-Kommandos fernsteuern konnte. Was REXX in den Anfangszügen nicht hatte, waren regular expressions. Die vermisst man aber als Profi.
  • PERL hatte zwar eine nicht so durchsichtige Konstruktion bei multidimensionalen Arrays, doch es kannte regular expressions. Mit Perl baute ich vor Jahren ein Skriptframework auf, dass aber relativ bald durch eine echte Applikation mit Visual Basic AN MS-Access bzw. DB/2 lief. Bitte AN so lesen, wie es auf einer Speisekarte vorkommt.
  • VB lief nicht auf Linux. Mit Mono wollte ich nichts anfangen. Ich suchte also eine Sprache, die Plattform übergreifend lief und nicht JAVA war. Oder auch nicht PHP, was mir von der Syntax nicht gefällt oder JAVASCRIPT, was gerade im Browser vielleicht seine Berechtigung hat. Ich fand Python. Diese Sprache begeistert mich, wie es einst FORTH tat, wie es REXX und PERL gelang, und wie es einen Zeitlang auch SMALLTALK schaffte. Mit Python habe ich noch keine Grenzen bisher entdecken können. Für eine Skriptsprache - versteht sich. Python kann beliebige Arrays in verschiedensten Geschmacksrichtungen, es verfügt über regular Expressions, es ist interpretiert, obwohl man auch Exes erstellen kann. Und es gibt sehr viele Leute, die immer daran weiterbauen. Das unter der Kontrolle von Guido van Rossum, den ich für einen ziemlich guten Typen halte.
Nächstes Mal gibt es wieder Beispiele...

Trackback URL:
http://steppenhund.twoday.net/stories/die-liste-die-sich-selbst-enthaelt/modTrackback

Aktuelle Beiträge

4:31 noch einmal
Diesmal im ganz kleinen Rahmen. Um ein Uhr wollten...
steppenhund - 20. Dez, 04:43
Nun, tatsächlich...
Nun, tatsächlich waren manche der Kinder schon...
steppenhund - 19. Dez, 18:33
um 3 uhr 30 kinderfreundlich?
um 3 uhr 30 kinderfreundlich?
testsiegerin - 19. Dez, 14:39
@Sigmund, darüber...
@Sigmund, darüber sind wir uns ausnahmsweise einig.
Reich W. (Gast) - 19. Dez, 14:24
da ist kaum ein Unterschied...
da ist kaum ein Unterschied :))
PeZwo - 19. Dez, 05:35
04:31
Kann mir gar nicht vorstellen, dass diese Zeit stimmt....
steppenhund - 19. Dez, 04:36
Jetzt würde mich...
Jetzt würde mich ja schon interessieren, wer diesen...
steppenhund - 19. Dez, 04:30
O tempora o mores
Schade, dass ich Dich nicht mehr therapieren kann.
Freud S. (Gast) - 19. Dez, 00:49
Ich nix IT, ich Kienstla...
Ich nix IT, ich Kienstla !
steppenhund - 18. Dez, 13:47
Natürlich! LAP-top,...
Natürlich! LAP-top, der beste LAP, den man gerade...
steppenhund - 18. Dez, 13:47
Das heißt nicht...
Das heißt nicht unstet, sondern "Lebensabschnittspartner". .. :-)
yonosequepasara - 18. Dez, 13:44
:))) So sind sie eben,...
:))) So sind sie eben, die IT-Leute...
PeZwo - 18. Dez, 12:26

Also wer war da?

Archiv

September 2009
Mo
Di
Mi
Do
Fr
Sa
So
 
 2 
 3 
 4 
 5 
 7 
 9 
11
12
15
16
22
27
 
 
 
 
 

Meine Kommentare

Die Anmerkung mit dem...
Die Anmerkung mit dem Klavierspiel finde ich ganz amüsant....
begleitschreiben - 19. Dez, 19:44
Nun, tatsächlich...
Nun, tatsächlich waren manche der Kinder schon...
steppenhund - 19. Dez, 18:33
Jetzt würde mich...
Jetzt würde mich ja schon interessieren, wer diesen...
steppenhund - 19. Dez, 04:30
Ich nix IT, ich Kienstla...
Ich nix IT, ich Kienstla !
steppenhund - 18. Dez, 13:47
Natürlich! LAP-top,...
Natürlich! LAP-top, der beste LAP, den man gerade...
steppenhund - 18. Dez, 13:47
Ich stimme diesem Kommentar...
Ich stimme diesem Kommentar zu.
begleitschreiben - 18. Dez, 10:14
Dazu war die Vorlage...
Und ich pflege ja auch manchmal scherzhaft zu behaupten,...
begleitschreiben - 18. Dez, 10:12
Auf so ein Spezialgebiet...
Auf so ein Spezialgebiet wage ich mich natürlich...
virtualmono - 17. Dez, 23:30

Status

Online seit 1421 Tagen
Zuletzt aktualisiert: 20. Dez, 04:43