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

Bur*_*lid 123 python syntax list comma trailing

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

>>> ['a','b',]
['a', 'b']
Run Code Online (Sandbox Code Playgroud)

这是有道理的,当因为它的元组('a')('a',)是两个不同的东西,但在名单?

Ray*_*ger 193

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

更改:

s = ['manny',
     'mo',
     'jack',
]
Run Code Online (Sandbox Code Playgroud)

至:

s = ['manny',
     'mo',
     'jack',
     'roger',
]
Run Code Online (Sandbox Code Playgroud)

差异只涉及差异的一行变化:

  s = ['manny',
       'mo',
       'jack',
+      'roger',
  ]
Run Code Online (Sandbox Code Playgroud)

当省略尾随逗号时,这打败了更令人困惑的多行差异:

  s = ['manny',
       'mo',
-      'jack'
+      'jack',
+      'roger'
  ]
Run Code Online (Sandbox Code Playgroud)

后一种差异使得更难以看到只添加了一行而另一行没有改变内容.

它还降低了这样做的风险:

s = ['manny',
     'mo',
     'jack'
     'roger'  # Added this line, but forgot to add a comma on the previous line
]
Run Code Online (Sandbox Code Playgroud)

并触发隐式字符串文字串联,s = ['manny', 'mo', 'jackroger']而不是预期的结果.

  • @BurhanKhalid:语言设计师是程序员,程序员做很多事情来让他们的生活更轻松. (87认同)
  • 这也使得其他程序更容易自动生成代码 - 每个项目打印""\"item \","`比打印每个项目的"\"item \""`更容易通过`","`除了最后一项之外的所有项目. (20认同)
  • @Burhan如果你不相信这个解释,那么定义语法的方式怎么样呢?;)比较`List ="["{Item","}"]".```List ="["({Item","} Item |)"]". (10认同)
  • @Voo我也一样认为,但后者的语法无论如何都要定义,因为它仍然是一个有效的Python列表. (7认同)
  • 这使(最)有意义,但如果语言的解析器旨在使差异更容易,我真的会感到惊讶. (5认同)
  • @BurhanKhalid并不是为了让diff程序变得更容易; 相反,目标是让人们更容易制作和审查编辑. (3认同)
  • 我认为`s = [`也应该单独使用,以防'many'`元素需要更改。 (2认同)

Ósc*_*pez 32

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


Kei*_*ith 26

它有助于消除某种错误.在多行上写清单有时更清楚.但是,在以后的维护中,您可能需要重新排列项目.

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

# Now you want to rearrange

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

# Now you have an error
Run Code Online (Sandbox Code Playgroud)

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

  • 即使您将逗号添加到每个元素之前,仍然必须在第一个元素上省略逗号. (33认同)

ric*_*cho 6

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

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