¿Por qué se permiten las comas finales en una lista?


Tengo curiosidad por saber por qué en Python una coma final en una lista es una sintaxis válida, y parece que Python simplemente la ignora:

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

Tiene sentido cuando es una tupla ya que ('a') y ('a',) son dos cosas diferentes, pero en listas?

Author: martineau, 2012-07-22

5 answers

Las principales ventajas son que hace que las listas multilínea sean más fáciles de editar y que reduce el desorden en las diferencias.

Cambiando:

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

A:

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

Implica solo un cambio de una línea en el diff:

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

Esto supera al diff multilínea más confuso cuando se omitió la coma final:

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

Esta última diferencia hace que sea más difícil ver que solo se agregó una línea y que la otra línea no cambió el contenido.

También reduce el riesgo de haciendo esto:

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

Y desencadenando la concatenación literal de cadena implícita, produciendo s = ['manny', 'mo', 'jackroger'] en lugar del resultado deseado.

 144
Author: Raymond Hettinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-27 00:35:37

Es una convención sintáctica común permitir comas finales en una matriz, lenguajes como C y Java lo permiten, y Python parece haber adoptado esta convención para su estructura de datos de listas. Es particularmente útil cuando se genera código para rellenar una lista: basta con generar una secuencia de elementos y comas, sin necesidad de considerar la última como un caso especial que no debería tener una coma al final.

 30
Author: Óscar López,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-30 17:41:37

Ayuda a eliminar un cierto tipo de error. A veces es más claro escribir listas en varias líneas. Pero en, más tarde maintenace es posible que desee reorganizar los elementos.

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

# Now you want to rearrange

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

# Now you have an error

Pero si permite las comas finales y las usa, puede reorganizar fácilmente las líneas sin introducir un error.

 23
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-22 05:18:53

Una tupla es diferente porque ('a') se expande usando la continuación implícita y ()s como un operador de precedencia, mientras que ('a',) se refiere a una tupla de longitud 1.

Su ejemplo original habría sido tuple('a')

 3
Author: richo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-01 19:10:11

La razón principal es hacer diff menos complicado. Por ejemplo, usted tiene una lista :

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

Y desea agregar otro elemento a ella. Entonces terminarás haciendo esto:

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

Por lo tanto, diff mostrará que se han cambiado dos líneas, primero agregando ',' en línea con 'c' y agregando 'd' en la última línea.

Por lo tanto, python permite ',' al final del último elemento de la lista, para evitar diferencias adicionales que pueden causar confusión.

 0
Author: Nitish Chauhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-15 16:59:11