繁体   English   中英

字典,列表或集合末尾的额外逗号是否有任何特殊含义?

[英]does the extra comma at the end of a dict, list or set has any special meaning?

我偶然注意到在列表,dict或set的末尾添加一个额外的分隔符逗号在语法上是正确的,并且似乎没有向数据结构添加任何内容:

In [1]: d1 = {'a': 1, 'b': 2}

In [2]: d2 = {'c': 10, 'd': 20,}

In [3]: d1
Out[3]: {'a': 1, 'b': 2}

In [4]: d2
Out[4]: {'c': 10, 'd': 20}

它有什么特殊含义或用法吗? 我发现的唯一一个是在初始化期间显式化数据结构:

In [14]: r = (1)

In [15]: r
Out[15]: 1

In [16]: r = (1,)

In [17]: r
Out[17]: (1,)

它在列表或字典中没有特殊含义,但在使用源代码更改管理工具时非常有用,请参见下文。

通过在元素之间使用逗号来定义非空元组,括号是可选的,并且仅在逗号可具有不同含义的上下文中需要。

因为逗号定义了元组,所以如果只有一个元素,则至少需要一个逗号:

>>> 1
1
>>> 1,
(1,)
>>> type((1,)) # need parens to distinguish comma from the argument separator
<type 'tuple'>

使用空括号定义空元组:

>>> type(())
<type 'tuple'>

尾随逗号有助于最小化添加新行时更改的行数; 使用尾随逗号向字典中添加其他行不会更改上一个现有条目:

a_value = {
    key1: value1,
    key2: value2,
    # inserting here doesn't require adding a comma
    # to the preceding line.
}

它对多行的一致性很有用:

d1 = {
    'a': 1,
    'b': 2,
}

您可以重新排列或添加行而不更改逗号。 它不会改变所代表的信息。

您可以使用dis模块验证两个对象的行为是否完全相同。

In [10]: import dis

In [11]: def make_dict():
    return {"a": 1, "b": 2}
   ....: 

In [12]: def make_dict_2():
    return {"a": 1, "b": 2,}
   ....: 

In [13]: dis.dis(make_dict)
  2           0 BUILD_MAP                2
              3 LOAD_CONST               1 (1)
              6 LOAD_CONST               2 ('a')
              9 STORE_MAP           
             10 LOAD_CONST               3 (2)
             13 LOAD_CONST               4 ('b')
             16 STORE_MAP           
             17 RETURN_VALUE        

In [14]: dis.dis(make_dict_2)
  2           0 BUILD_MAP                2
              3 LOAD_CONST               1 (1)
              6 LOAD_CONST               2 ('a')
              9 STORE_MAP           
             10 LOAD_CONST               3 (2)
             13 LOAD_CONST               4 ('b')
             16 STORE_MAP           
             17 RETURN_VALUE 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM