为什么列表中允许尾随逗号?


135

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

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

自从('a')('a',)是两个元组时,它是一个有意义的元组,但是在列表中呢?



7
C,C ++,Java,JavaScript等列表中也可以使用逗号结尾
。– Nayuki

Answers:


222

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

变更:

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
这是(最)有意义的,但是如果语言的解析器旨在使diffs更容易设计,我真的会感到惊讶。
Burhan Khalid 2012年

94
@BurhanKhalid:语言设计师是程序员,程序员做了很多事情来使他们的生活更轻松。
格雷格·休吉尔

10
@Burhan如果您不相信这种解释,那么以这种方式定义语法也更简单吗?;)比较List = "[" {Item ","} "]".vs.List = "[" ({Item","}Item|)"]".
Voo

23
这也使其他程序更容易自动生成代码-仅打印"\"item\","每个项目比打印"\"item\""每个项目然后打印除最后一个项目之外的其他项目要容易得多","
亚当·罗森菲尔德2013年

9
@Voo我也这么认为,但是无论如何都必须定义后者的语法,因为它仍然是有效的Python列表。
Alexander Suraphel 2015年

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
即使您在每个元素前添加逗号,也仍然必须在第一个元素上省略逗号。
格雷格(Greg Hewgill)

短绒棉应该能够抓住这一点,不是吗?
viki.omega9 2016年

6

元组的不同之处在于,('a')它使用隐式连续和()s作为优先运算符进行扩展,而('a',)引用长度为1的元组。

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


('a'),是一个字符串;但是我的意思是,元组中的尾部逗号很重要,但是在列表中,它们似乎还不是Python接受的。
Burhan Khalid 2012年

1
在这两种情况下,它们都被静默丢弃,只是在元组中需要将其与括号中的字符串区分开。
richo 2012年

tuple('a')可能是一个坏榜样,因为在一般的tuple(x)(x,)是不一样的东西。tuple('ab') != ('ab',)tuple('a') == ('a',)仅因为它'a'是长度为1的字符串
。– chepner

从REPL:>>> ("a",) == ("a") >>> ("ab",) == ("ab") >>> ("ab", "bc",) == ("ab", "bc")
Seraphya

1

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

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

并且您想要向其中添加另一个元素。然后,您将最终执行此操作:

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

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

因此,python允许在列表的最后一个元素中尾部加上',',以防止可能引起混淆的额外差异。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.