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


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.