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?



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.


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.


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.


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')


('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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.