Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么列表中允许尾随逗号?_Python_List_Syntax_Comma_Trailing - Fatal编程技术网

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

Python 为什么列表中允许尾随逗号?,python,list,syntax,comma,trailing,Python,List,Syntax,Comma,Trailing,我很好奇为什么在Python中,列表中的尾随逗号是有效语法,而Python似乎只是忽略了它: >>> ['a','b',] ['a', 'b'] 当它是一个元组时,它是有意义的,因为('a')和('a'),)是两个不同的东西,但在列表中?在数组中允许尾随逗号是一种常见的语法约定,C和Java等语言允许这样做,Python似乎已经采用了这种约定作为其列表数据结构。在生成一个填充列表的代码时特别有用:只生成一个元素和逗号的序列,不需要考虑最后一个作为结束时不应该有逗号的特殊情况。

我很好奇为什么在Python中,列表中的尾随逗号是有效语法,而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等列表中也允许使用逗号逗号。