末尾のコンマがリストで許可されているのはなぜですか?


135

Pythonでリストの末尾のカンマが有効な構文である理由を知りたいのですが、Pythonでは単に無視されているようです。

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

それは理にかなっているとき、そのA組以来('a')('a',)二つの異なるものですが、リストにありますか?



7
末尾のコンマはまたなどC、C ++、Javaのは、JavaScriptにリストで許可されている
Nayuki

回答:


223

主な利点は、複数行のリストを編集しやすくすることと、diffの乱雑さを減らすことです。

変化:

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

に:

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

差分の1行の変更のみが含まれます。

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

これは、末尾のコンマが省略された場合の、より混乱する複数行の相違を打ち消します。

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

後者のdiffを使用すると、1行だけが追加され、他の行が内容を変更しなかったことがわかりにくくなります。

また、これを行うリスクも軽減されます。

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

暗黙的な文字列リテラル連結をトリガーしs = ['manny', 'mo', 'jackroger']、意図した結果の代わりに生成します。


6
これは(ほとんど)理にかなっていますが、言語のパーサーがdiffをより簡単にするように設計されていれば、私は本当に驚きます。
Burhan Khalid

94
@BurhanKhalid:言語デザイナーはプログラマーであり、プログラマーは生活を楽にするために多くのことをします。
グレッグヒューギル2012

10
@Burhanその説明を信じないなら、そのように文法を定義することも簡単でしょうか?;)比較List = "[" {Item ","} "]".List = "[" ({Item","}Item|)"]".
VOO

23
これにより、他のプログラムがコードを自動生成するのも簡単になります。各項目"\"item\","を印刷"\"item\""してから","最後の項目を除いてすべて印刷するよりも、各項目を印刷する方がはるかに簡単です。
アダムローゼンフィールド2013年

9
@Voo私も同じように思ったが、それでも有効なPythonリストであるため、後者の文法はとにかく定義する必要がある。
Alexander Suraphel、2015

34

これは、配列の末尾のコンマを許可する一般的な構文規則であり、CやJavaなどの言語では許可されており、Pythonはリストデータ構造にこの規則を採用しているようです。リストを生成するためのコードを生成する場合に特に便利です。要素とコンマのシーケンスを生成するだけで、最後のコンマを最後にコンマを付けてはならない特別なケースと見なす必要はありません。


30

ある種のバグを取り除くのに役立ちます。複数行にリストを記述する方が明確な場合があります。ただし、後でメンテナンスを行って、アイテムを再配置することができます。

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

# Now you want to rearrange

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

# Now you have an error

ただし、末尾のコンマを許可して使用すると、エラーを発生させることなく、行を簡単に再配置できます。


1
これはすばらしいですが、コンマを前に付けることでこれを回避できます。SQLを書くときはいつもそうしています
Burhan Khalid

38
各要素の前にコンマを付加しても、最初の要素ではコンマを省略する必要があります。
グレッグヒューギル2012

リンターはこれを捕まえることができるはずですよね?
viki.omega9

6

タプルは('a')、暗黙の継続と()優先演算子としてs を使用して展開されるため、異なり('a',)ますが、長さ1のタプルを参照します。

あなたの元の例は tuple('a')


('a'),文字列です。しかし、私のポイントは、タプルの末尾のコンマは重要ですが、リストではそれらがまだPythonで受け入れられていないようです。
Burhan Khalid

1
どちらの場合も暗黙的に破棄されます。タプルでは、​​括弧内の文字列と区別する必要があるだけです。
リコ

tuple('a')一般的tuple(x)(x,)は同じではないため、おそらく悪い例です。tuple('ab') != ('ab',)tuple('a') == ('a',)理由だけで、'a'長さ1の文字列である
chepner

REPLから:>>> ("a",) == ("a") False >>> ("ab",) == ("ab") False >>> ("ab", "bc",) == ("ab", "bc") True
Seraphya

1

主な理由は、diffの複雑さを軽減するためです。たとえば、あなたはリストを持っています:

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

別の要素を追加したいとします。次に、これを行うことになります:

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

したがって、diffは2つの行が変更されたことを示します。最初に「c」に合わせて「、」を追加し、最後の行に「d」を追加します。

そのため、pythonでは、リストの最後の要素の末尾に「、」を付けることで、混乱の原因となる余分なdiffを防ぐことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.