Warum sind nachfolgende Kommas in einer Liste zulässig?

135

Ich bin gespannt, warum in Python ein nachfolgendes Komma in einer Liste eine gültige Syntax ist, und es scheint, dass Python es einfach ignoriert:

>>> ['a','b',]
['a', 'b']

Es macht Sinn, wenn es seitdem ein Tupel ist ('a')und ('a',)zwei verschiedene Dinge sind, aber in Listen?

Burhan Khalid
quelle
stackoverflow.com/questions/7992559/…
Ciro Santilli 法轮功 冠状 病 六四. 法轮功
7
Ein nachfolgendes Komma ist auch in Listen in C, C ++, Java, JavaScript usw.
zulässig

Antworten:

222

Die Hauptvorteile bestehen darin, dass mehrzeilige Listen einfacher zu bearbeiten sind und die Unordnung bei Unterschieden verringert wird.

Ändern:

s = ['manny',
     'mo',
     'jack',
]

zu:

s = ['manny',
     'mo',
     'jack',
     'roger',
]

beinhaltet nur eine einzeilige Änderung im Diff:

  s = ['manny',
       'mo',
       'jack',
+      'roger',
  ]

Dies übertrifft das verwirrendere mehrzeilige Diff, wenn das nachfolgende Komma weggelassen wurde:

  s = ['manny',
       'mo',
-      'jack'
+      'jack',
+      'roger'
  ]

Der letztere Unterschied macht es schwieriger zu erkennen, dass nur eine Zeile hinzugefügt wurde und dass die andere Zeile den Inhalt nicht geändert hat.

Dies verringert auch das Risiko:

s = ['manny',
     'mo',
     'jack'
     'roger'  # Added this line, but forgot to add a comma on the previous line
]

und Auslösen einer impliziten Verkettung von Zeichenfolgenliteralen , wobei s = ['manny', 'mo', 'jackroger']anstelle des beabsichtigten Ergebnisses erzeugt wird.

Raymond Hettinger
quelle
6
Das macht (am meisten) Sinn, aber ich wäre wirklich überrascht, wenn der Parser der Sprache so gestaltet wäre, dass er die Unterschiede erleichtert.
Burhan Khalid
94
@ BurhanKhalid: Sprachdesigner sind Programmierer, und Programmierer tun viele Dinge, um ihnen das Leben zu erleichtern.
Greg Hewgill
10
@Burhan Wenn Sie dieser Erklärung nicht glauben, wie wäre es dann auch einfacher, die Grammatik so zu definieren? ;) Vergleiche List = "[" {Item ","} "]".vs.List = "[" ({Item","}Item|)"]".
Voo
23
Dies erleichtert auch anderen Programmen die automatische Generierung von Code. Es ist viel einfacher, nur "\"item\","für jedes Element zu drucken, als "\"item\""für jedes Element, gefolgt von ","allen bis auf das letzte Element.
Adam Rosenfield
9
@Voo Ich dachte das auch, aber die letztere Grammatik muss trotzdem definiert werden, da es sich immer noch um eine gültige Python-Liste handelt.
Alexander Suraphel
34

Es ist eine übliche syntaktische Konvention, nachgestellte Kommas in einem Array zuzulassen, Sprachen wie C und Java erlauben dies, und Python scheint diese Konvention für seine Listendatenstruktur übernommen zu haben. Dies ist besonders nützlich, wenn Sie Code zum Auffüllen einer Liste generieren: Generieren Sie einfach eine Folge von Elementen und Kommas. Sie müssen den letzten nicht als Sonderfall betrachten, der am Ende kein Komma enthalten sollte.

Óscar López
quelle
30

Es hilft, eine bestimmte Art von Fehler zu beseitigen. Es ist manchmal klarer, Listen in mehreren Zeilen zu schreiben. In der späteren Wartung möchten Sie die Elemente möglicherweise neu anordnen.

l1 = [
        1,
        2,
        3,
        4,
        5
]

# Now you want to rearrange

l1 = [
        1,
        2,
        3,
        5
        4,
]

# Now you have an error

Wenn Sie jedoch nachgestellte Kommas zulassen und diese verwenden, können Sie die Zeilen problemlos neu anordnen, ohne dass ein Fehler auftritt.

Keith
quelle
1
Dies ist ordentlich, aber Sie können dies vermeiden, indem Sie das Komma voranstellen. Ich mache das die ganze Zeit, wenn ich SQL schreibe
Burhan Khalid
38
Selbst wenn Sie jedem Element das Komma voranstellen, müssen Sie das Komma im ersten Element weglassen.
Greg Hewgill
Ein Linter sollte das fangen können, oder?
viki.omega9
6

Ein Tupel ist anders, weil ('a')es unter Verwendung der impliziten Fortsetzung und ()s als Präzedenzoperator erweitert wird, während es ('a',)sich auf ein Tupel der Länge 1 bezieht.

Ihr ursprüngliches Beispiel wäre gewesen tuple('a')

Richo
quelle
('a'),ist eine Zeichenfolge; Mein Punkt war jedoch, dass nachgestellte Kommas in Tupeln von Bedeutung sind, aber in Listen scheinen sie noch nicht zu sein. Python akzeptiert sie.
Burhan Khalid
1
In beiden Fällen werden sie stillschweigend verworfen. In einem Tupel muss es nur von einer Zeichenfolge in Klammern unterschieden werden.
Richo
tuple('a')ist wahrscheinlich ein schlechtes Beispiel, weil im Allgemeinen tuple(x)und (x,)nicht das gleiche sind. tuple('ab') != ('ab',). tuple('a') == ('a',)nur weil 'a'ist eine Zeichenfolge der Länge 1.
chepner
Von der REPL: >>> ("a",) == ("a") Falsch >>> ("ab",) == ("ab") Falsch >>> ("ab", "bc",) == ("ab", "bc") Wahr
Seraphya
1

Der Hauptgrund ist, Diff weniger kompliziert zu machen. Zum Beispiel haben Sie eine Liste:

list = [
    'a',
    'b',
    'c'
]

und Sie möchten ein weiteres Element hinzufügen. Dann werden Sie am Ende Folgendes tun:

list = [
    'a',
    'b',
    'c',
    'd'
]

Daher zeigt diff, dass zwei Zeilen geändert wurden, wobei zuerst ',' in Übereinstimmung mit 'c' und 'd' in der letzten Zeile hinzugefügt wurden.

Python erlaubt es also, ',' im letzten Element der Liste zu verfolgen, um zusätzliche Unterschiede zu vermeiden, die Verwirrung stiften können.

Nitish Chauhan
quelle