160

我很好奇为什么在 Python 中列表中的尾随逗号是有效的语法,而 Python 似乎只是忽略了它:

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

当它是一个元组时它是有意义的,因为('a')and('a',)是两个不同的东西,但是在列表中?

4

5 回答 5

269

主要优点是它使多行列表更易于编辑,并且减少了差异中的混乱。

改变:

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']而不是预期的结果。

于 2012-07-22T05:15:53.237 回答
39

允许在数组中使用尾随逗号是一种常见的语法约定,C 和 Java 等语言允许这样做,而 Python 似乎已将这种约定用于其列表数据结构。它在生成填充列表的代码时特别有用:只需生成一系列元素和逗号,无需将最后一个视为特殊情况,末尾不应有逗号。

于 2012-07-22T05:14:29.157 回答
35

它有助于消除某种错误。有时在多行上编写列表会更清晰。但是在以后的维护中,您可能需要重新排列这些项目。

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

# Now you want to rearrange

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

# Now you have an error

但是,如果您允许尾随逗号并使用它们,您可以轻松地重新排列行而不会引入错误。

于 2012-07-22T05:18:53.917 回答
6

元组是不同的,因为('a')它使用隐式延续和()s 作为优先运算符进行扩展,而('a',)它指的是长度为 1 的元组。

你原来的例子是tuple('a')

于 2012-07-22T05:24:35.987 回答
3

主要原因是使差异不那么复杂。例如,您有一个列表:

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

并且您想向其中添加另一个元素。然后你最终会这样做:

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

因此,diff 将显示两行已更改,首先添加','与'c'一致,并在最后一行添加'd'。

因此,python 允许在列表的最后一个元素中使用尾随 ',',以防止可能导致混淆的额外差异。

于 2018-04-15T16:59:11.127 回答