Ich dachte es ginge um PythonY0Gi hat geschrieben:Oh, ich dachte, es dreht sich hier nur um ProgrammiersprachenLeonidas hat geschrieben:Y0Gi: Visual Basic tut das auch. Also zumindest bis Version 6.
Warum fangen Listen eigentlich mit 0 an?
Meine Delphi-Erfahrungen sind schon ein paar Jahre her, aber soweit ich weiß, ist folgendes gültige Syntax und lässt ein Array bei 1 beginnen:n4p hat geschrieben:Wo hast du das denn her?
Code: Alles auswählen
var zahlen: array[1...10] of string;
@Lunar: Das stimmt zwar, aber deswegen würde ich Delphi nicht als Einser-Offset-Sprache bezeichnen. Man kann da nämlich mit *jedem* Index beginnen:
Damit gehört Delphi also genauso zu der seltenen Gattung der 23er-Offset-Sprachen, aber eben auch zu den Nuller-Offset-Sprachen. Es liegt in der Hand des Programmierers.
Ich hatte bei Pascal jedenfalls immer brav bei 0 angefangen, weil ich das von CBM BASIC V2 vom C64 so kannte und mir die Offsetberechnung, die in Maschinensprache dahinter steckt, bekannt war.
Code: Alles auswählen
Var Foos: Array[23..42] Of tBar;
Ich hatte bei Pascal jedenfalls immer brav bei 0 angefangen, weil ich das von CBM BASIC V2 vom C64 so kannte und mir die Offsetberechnung, die in Maschinensprache dahinter steckt, bekannt war.
Inwiefern? Man kann bei Pascal Ranges verwenden, die dann die gültigen Indizes angeben. Das erste Element in meinem Beispiel hat den Index 23. Werte kleiner als 23 werden als Bereichsverletzung aufgefasst, falls die entsprechenden Prüfungen zur Laufzeit aktiviert sind, ansonsten wird auf Elemente *vor* dem Array zugegriffen. Die Adressberechnung im Maschinencode für den Index `i` sieht so aus: ``@Foo-23+i``. ``@`` ist in Pascal der "Address-Of"-Operator.
Ok, dann zahlen wir Delphi eben zur Gattung der "Jedes-Offset-ist-möglich"-Sprachen Ich wollte nur darauf hinaus, dass Delphi nicht bei null anfängt, da der OP die null ja erwähnt hatte.BlackJack hat geschrieben:@Lunar: Das stimmt zwar, aber deswegen würde ich Delphi nicht als Einser-Offset-Sprache bezeichnen.
Python gehört auch zu den "Jedes-Offset-ist-möglich"-Sprachen.
Nur weil die Standardklassen das so wollen, muss man's ja nicht beibehalten.
Mal ein einfaches Beispiel:
Erweitert die Klasse `list` ganz einfach um die Möglichkeit, selbst den Startindex zu bestimmen.
Nur weil die Standardklassen das so wollen, muss man's ja nicht beibehalten.
Mal ein einfaches Beispiel:
Code: Alles auswählen
class OffsetList(list):
def __init__(self, offset=0):
super(OffsetList, self).__init__()
self.offset = offset
def __setitem__(self, index, item):
s = super(OffsetList, self)
return s.__setitem__(index - self.offset, item)
def __getitem__(self, index):
s = super(OffsetList, self)
return s.__getitem__(index - self.offset)
Eine eigene Listenimplementierung, die dann irgendwo anfängt zu zählen, kannst du in jeder beliebigen Sprache schreiben. Man kann nur nicht in jeder Sprache den Operator dazu überladen und muss ggf. anders auf die Elemente zugreifen. Daher sieht man den Unterschied nur nicht.
Von Haus aus beginnt Python also bei 0.
Von Haus aus beginnt Python also bei 0.
Natürlich aber ich denke Delphi oder sonsteine Sprache wird intern auch, unabhängig davon, bei welchem Wert man anfängt, auf 0 zeigen, oder?EyDu hat geschrieben:Eine eigene Listenimplementierung, die dann irgendwo anfängt zu zählen, kannst du in jeder beliebigen Sprache schreiben. Man kann nur nicht in jeder Sprache den Operator dazu überladen und muss ggf. anders auf die Elemente zugreifen. Daher sieht man den Unterschied nur nicht.
Von Haus aus beginnt Python also bei 0.
Das wäre dann ja nichts anderes als die obige Klasse.
Deshalb würde ich schon sagen, dass Python nicht unbedingt bei 0 anfängt.
Eine Frage der Implementierung der list-Klassen (ich zähle zu List-Klassen jetzt einfach mal alle Klassen, die den Indexoperator implementiert haben, ich kenn mich nicht mit den Fachbegriffen aus ), wo man anfängt.
Man hätte die Klasse ja auch von Haus aus so schreiben können, wie ich das jetzt oben gemacht habe, wäre ja Python an sich egal und dadurch wär's immer noch dieselbe Sprache. Wobei das wahrscheinlich nicht unbedingt den Prinzipien von Python entspricht, weshalb man dann auch streng genommen sagen könnte "Das ist kein Python", aber das ist jetzt Haarspalterei.
Gibts das auch als "normalen" Text? Ich hab keine Lust mir englische handgeschriebene Texte durchzulesen, welche ein Thema zu einem Fachbereich behandeln, das ist irgendwie doppelt anstrengend :p
Ich fand es gerade nett, das Dijkstra seine Gedanken noch mit der Hand aufgeschrieben hat und das auch noch in einer sehr ausdrucksstarken Schrift. Aber wenn's sein muss...
Stefan
Stefan
Naja vielleicht schon nett, aber ich bin vielleicht einfach zu dumm dazusma hat geschrieben:Ich fand es gerade nett, das Dijkstra seine Gedanken noch mit der Hand aufgeschrieben hat und das auch noch in einer sehr ausdrucksstarken Schrift. Aber wenn's sein muss...
Stefan
Danke für den Link