Почему конечные запятые разрешены в списке?

Мне любопытно, почему в Python конечная запятая в списке является синтаксисом, и кажется, что Python просто игнорирует ее:

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

Это имеет смысл, когда его кортеж с ('a') и ('a',) - это две разные вещи, но в списках?

Ответ 1

Основные преимущества заключаются в том, что он упрощает редактирование многострочных списков и уменьшает беспорядок в diff.

Изменение:

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

в

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

включает только однострочное изменение diff:

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

Это превосходит более запутанный многострочный diff, когда конечная запятая была опущена:

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

Последний diff затрудняет увидеть, что добавлена ​​только одна строка, а другая строка не изменила контент.

Это также снижает риск этого:

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

и запуск неявного строкового конкатенации строк, создавая s = ['manny', 'mo', 'jackroger'] вместо предполагаемого результата.

Ответ 2

Это распространенное синтаксическое соглашение, позволяющее использовать запятые в массиве, такие языки как C и Java позволяют это, и Python, похоже, принял это соглашение для своей структуры данных списка. Это особенно полезно при создании кода для заполнения списка: просто сгенерируйте последовательность элементов и запятых, нет необходимости рассматривать последний как специальный случай, который не имеет запятой в конце.

Ответ 3

Это помогает устранить определенный тип ошибок. Иногда бывает проще писать списки на нескольких строках. Но, позже, вы можете захотеть переупорядочить предметы.

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

# Now you want to rearrange

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

# Now you have an error

Но если вы разрешаете запятые и используете их, вы можете легко изменить порядок строк без введения ошибки.

Ответ 4

Кортеж отличается от того, что ('a') разворачивается с использованием неявного продолжения и () в качестве оператора оценки, тогда как ('a',) относится к длине 1 кортеж.

Ваш оригинальный пример был бы tuple('a')