Python 为什么列表中允许尾随逗号?
我很好奇为什么在Python中,列表中的尾随逗号是有效语法,而Python似乎只是忽略了它:Python 为什么列表中允许尾随逗号?,python,list,syntax,comma,trailing,Python,List,Syntax,Comma,Trailing,我很好奇为什么在Python中,列表中的尾随逗号是有效语法,而Python似乎只是忽略了它: >>> ['a','b',] ['a', 'b'] 当它是一个元组时,它是有意义的,因为('a')和('a'),)是两个不同的东西,但在列表中?在数组中允许尾随逗号是一种常见的语法约定,C和Java等语言允许这样做,Python似乎已经采用了这种约定作为其列表数据结构。在生成一个填充列表的代码时特别有用:只生成一个元素和逗号的序列,不需要考虑最后一个作为结束时不应该有逗号的特殊情况。
>>> ['a','b',]
['a', 'b']
当它是一个元组时,它是有意义的,因为
('a')
和('a'),)
是两个不同的东西,但在列表中?在数组中允许尾随逗号是一种常见的语法约定,C和Java等语言允许这样做,Python似乎已经采用了这种约定作为其列表数据结构。在生成一个填充列表的代码时特别有用:只生成一个元素和逗号的序列,不需要考虑最后一个作为结束时不应该有逗号的特殊情况。 的主要优点是它使得多行列表更易于编辑,并且减少了差异中的杂波。
更改:
s = ['manny',
'mo',
'jack',
]
致:
仅涉及差异中的一行更改:
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
]
list = [
'a',
'b',
'c',
'd'
]
和触发,产生
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')
作为前置运算符,而('A',)
指的是长度为1的元组
您最初的示例应该是
tuple('a')
主要原因是使diff不那么复杂。
例如,您有一个列表:
list = [
'a',
'b',
'c'
]
您希望向其中添加另一个元素。那么你最终会这样做:
s = ['manny',
'mo',
'jack'
'roger' # Added this line, but forgot to add a comma on the previous line
]
list = [
'a',
'b',
'c',
'd'
]
因此,diff将显示两行已更改,首先在“c”行中添加“,”并在最后一行中添加“d”
因此,python允许在列表的最后一个元素中拖尾“,”,以防止可能导致混淆的额外差异。这很好,但您可以通过预先挂起逗号来避免这种情况。我在编写SQL时总是这样做,即使在每个元素前面加上逗号,也必须在第一个元素上省略逗号;但我的观点是,元组中的尾随逗号很重要,但在列表中它们似乎并不重要,Python接受它们。在这两种情况下,它们都被默默地丢弃,只是在元组中需要将其与括号中的字符串区分开来。
tuple('a')
可能是一个坏例子,因为通常tuple(x)
和(x,)
不是一回事<代码>元组('ab')!=('ab',)<代码>元组('a')==('a',)仅仅是因为'a'
是一个长度为1的字符串。从REPL:>>(“a”,)==(“a”)
False>(“ab”,“ab”)==(“ab”,“bc”,“bc”)==(“ab”,“bc”)
>((最)合理,但是,如果语言的解析器是为了简化差异而设计的,我真的会感到惊讶。@BurhanKhalid:语言设计者是程序员,程序员做了很多事情来简化他们的生活。@Burhan如果你不相信这种解释,那么这样定义语法会更简单吗?;)比较List=“[”{Item“,“}”]”和List=“[”({Item“,“}Item |”)”””
这也使得其他程序更容易自动生成代码——只需为每个项目打印“\”Item\”,“
,比为每个项目打印“\”Item\”
,然后再打印,”要容易得多除了最后一个项目,所有的代码都是< /COD>。@ Voo我也这么认为,但是后面的java语法必须定义,因为它仍然是一个有效的Python列表。在C、C++、Java、JavaScript等列表中也允许使用逗号逗号。