Чому в списку дозволені тривалі коми?


135

Мені цікаво, чому в Python кінцевою комою у списку є синтаксис, і здається, що Python просто ігнорує його:

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

Є сенс, коли його кортеж з тих пір є ('a')і ('a',)дві різні речі, але в списках?



7
Додаткова кома також дозволена у списках на C, C ++, Java, JavaScript тощо
Nayuki

Відповіді:


223

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

Зміна:

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

до:

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

передбачає лише зміну одноліній у диференціалі:

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

Це перемагає більш заплутану багаторядкову різницю, коли пропускна кома була опущена:

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

Останнє розходження ускладнює бачення того, що додано лише один рядок, а інший рядок не змінює зміст.

Це також зменшує ризик зробити це:

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

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


6
Це має (найбільш) сенс, але я був би дуже здивований, якби синтаксичний розбір мови був спроектований на те, щоб зробити розрізники легшими.
Бурхан Халід

94
@BurhanKhalid: Мовні дизайнери - це програмісти, а програмісти роблять багато речей, щоб полегшити своє життя.
Грег Хьюгілл

10
@ Бурхан Якщо ви не вірите цьому поясненню, як щодо цього граматику так само простіше визначити? ;) Порівняйте List = "[" {Item ","} "]".протиList = "[" ({Item","}Item|)"]".
Voo

23
Це також полегшує автогенерацію коду іншим програмам - набагато простіше просто друкувати "\"item\","для кожного елемента, ніж друкувати "\"item\""для кожного елемента, а за ним, ","крім останнього.
Адам Розенфілд

9
@Voo Я теж вважав те саме, але останню граматику потрібно все-таки визначити, оскільки це все ще дійсний список Python.
Олександр Сурафель

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
Бурхан Халід

38
Навіть якщо ви додаєте кому до кожного елемента, вам все одно доведеться опустити кому на першому.
Грег Хьюгілл

Лайнер повинен бути в змозі це зловити, ні?
viki.omega9

6

Кортеж відрізняється тим ('a'), що розширюється за допомогою неявного продовження і ()s як оператора преференції, тоді як ('a',)відноситься до кортежу довжиною 1.

Ваш оригінальний приклад був би tuple('a')


('a'),- рядок; але моя думка полягала в тому, що проміжки коми в кортежах є значущими, але в списках вони, схоже, ще не вважають, що Python їх приймає.
Бурхан Халід

1
Вони мовчки відкидаються в обох випадках, просто в кортежі потрібно відрізнити його від рядка в дужці.
Річо

tuple('a')це, мабуть, поганий приклад, адже загалом tuple(x)і (x,)це не одне і те ж. tuple('ab') != ('ab',). tuple('a') == ('a',)тільки тому 'a', що це струна завдовжки 1.
Чепнер

З REPL: >>> ("a",) == ("a") False >>> ("ab",) == ("ab") False >>> ("ab", "bc",) == ("ab", "bc") True
Серафія

1

Основна причина - зробити різницю менш складною. Наприклад, у вас є список:

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

і ви хочете додати до нього ще один елемент. Тоді ви будете робити це:

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

таким чином, diff покаже, що два рядки були змінені, спочатку додавши ',' відповідно до 'c' та додаючи 'd' в останньому рядку.

Таким чином, python дозволяє відслідковувати "," в останньому елементі списку, щоб уникнути зайвих розбіжностей, що може спричинити плутанину.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.