为什么在列表中允许后跟逗号?

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

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

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

57094 次浏览

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

主要的优点是,它使多行列表更容易编辑,并减少杂乱的差异。

改变:

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

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

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


# Now you want to rearrange


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


# Now you have an error

但是如果您允许使用后面的逗号,并且使用它们,那么您可以很容易地重新排列行而不会引入错误。

元组是不同的,因为 ('a')是使用隐式连续和 ()作为前置操作符展开的,而 ('a',)是指长度为1的元组。

您最初的示例应该是 tuple('a')

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

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

然后你想给它添加另一个元素,那么你最终会得到这样的结果:

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

因此,diff 将显示两行已经更改,第一行添加’,’与’c’行,并在最后一行添加’d’。

因此,python 允许在 list 的最后一个元素中拖尾’,’以防止可能导致混淆的额外差异。