Мне любопытно, почему в Python конечная запятая в списке является допустимым синтаксисом, и кажется, что Python просто игнорирует ее:
>>> ['a','b',]
['a', 'b']
Это имеет смысл, когда это кортеж, поскольку ('a')
и ('a',)
- это две разные вещи, но в списках?
Ответы:
Основные преимущества заключаются в том, что он упрощает редактирование многострочных списков и уменьшает беспорядок в различиях.
Изменение:
чтобы:
включает в себя только однострочное изменение в diff:
Это превосходит более запутанный многострочный diff, когда конечная запятая была опущена:
Последнее различие затрудняет увидеть, что была добавлена только одна строка, а другая строка не изменила содержимое.
Это также снижает риск этого:
и запускает неявную конкатенацию строкового литерала , производя
s = ['manny', 'mo', 'jackroger']
вместо предполагаемого результата.источник
List = "[" {Item ","} "]".
vs.List = "[" ({Item","}Item|)"]".
"\"item\","
для каждого элемента, чем печатать"\"item\""
для каждого элемента, за которым следуют","
все элементы, кроме последнего.Это общепринятое синтаксическое соглашение, позволяющее использовать завершающие запятые в массиве, такие языки, как C и Java, допускают это, и Python, похоже, принял это соглашение для своей структуры данных списка. Это особенно полезно при генерации кода для заполнения списка: просто создайте последовательность элементов и запятых, не нужно рассматривать последний как особый случай, в котором не должно быть запятой в конце.
источник
Это помогает устранить определенный вид ошибки. Иногда проще писать списки в несколько строк. Но при более позднем обслуживании вы можете захотеть переставить элементы.
Но если вы разрешите запятые в конце и используете их, вы можете легко изменить порядок строк, не вызывая ошибки.
источник
Кортеж отличается тем, что
('a')
раскрывается с использованием неявного продолжения и()
s в качестве оператора приоритета, тогда как('a',)
относится к кортежу длиной 1.Ваш исходный пример был бы
tuple('a')
источник
('a'),
это строка; но я хотел сказать, что конечные запятые в кортежах имеют значение, но в списках они не кажутся, пока Python принимает их.tuple('a')
это, наверное, плохой пример, потому что в целомtuple(x)
и(x,)
это не одно и то же.tuple('ab') != ('ab',)
,tuple('a') == ('a',)
только потому, что'a'
это строка длины 1.>>> ("a",) == ("a")
Ложь>>> ("ab",) == ("ab")
Ложь>>> ("ab", "bc",) == ("ab", "bc")
ИстинаОсновная причина - сделать diff менее сложным. Например, у вас есть список:
и вы хотите добавить к нему еще один элемент. Тогда вы в конечном итоге сделаете это:
таким образом, diff покажет, что две строки были изменены, сначала добавив ',' в строке с 'c' и добавив 'd' в последней строке.
Итак, python допускает завершение ',' в последнем элементе списка, чтобы предотвратить дополнительные различия, которые могут вызвать путаницу.
источник