所以,我知道这个,
a = {} # dict
构造一个空字典.现在,我也接受了这个,
b = {1, 2, 3} # set
创建一个集合.这很容易验证,因为,
>>>print(type(a))>>>print(type(b))
虽然我理解它的作用,但我不明白为什么我们为集合和字典使用相同的语法.我试图找到有关在这背后的逻辑更多信息,set
与dict
本手册的部分,但遗憾的是,我什么都没出来.
任何人都可以向我解释为什么我们这样做?这是出于历史原因,还是我错过了一些明显的东西?
Python 2 中没有设置文字,历史上只用于字典的花括号.可以从列表(或任何迭代)生成集合:
set([1, 2, 3]) set([i for i in range(1, 3)])
Python 3引入了集合文字和理解(参见PEP-3100),它允许避免使用中间列表:
{1, 2, 3} {i for i in range(1, 3)}
空集表单,但是为字典保留为向后兼容性.检查PEP-3100的参考资料,即:P3K中的[Python-3000]设置?
我确信我们可以解决问题 - 我同意,
{}
对于空集和{:}
空字典是理想的,如果不是为了向后兼容.当我第一次写PEP时,我喜欢"特殊的空对象"的想法(即,有些{}
东西可以变成一个集合或字典),但是这里的一位教师让我相信它只会导致新人混淆思想(以及实施的痛苦).
将以下信息更好地描述这些规则:
我认为Guido有最好的解决方案.使用
set()
空套,使用{}
空类型的字典,使用{genexp}
了一套推导/显示器,使用{1,2,3}
显式集文字,并使用{k1:v1, k2:v2}
了字典文字.如果需求超过厌恶,我们总是可以添加{
/更}
晚.
语法不一样.字典首先使用花括号,并指定键值对,其中键和值由冒号分隔:
>>> {'foo': 'bar'} {'foo': 'bar'} >>> type(_)
稍后将集添加到语言中,{..}
大括号表示法仅指定元素,而不是对:
>>> {'foo'} set(['foo']) >>> type(_)
请注意,在Python 2中,解释器使用set()
callable 回显对象.这也是你如何指定一个空集:
>>> emptyset = set()
在Python 3中,{..}
在回显对象时使用较新的表示法,除非它是空的:
>>> {'foo'} {'foo'} >>> _ - {'foo'} # difference, removing the one element set()
该set()
类型在2.4版本中添加到Python语言中(参见PEP 218),在Python 3中添加了set literals的大括号语法,并反向移植到Python 2.7.
{}
用于空字典而不是空集的事实在很大程度上是历史原因.{'a': 100, 'b': 200}
自Python开始以来,字典的语法就已存在.{1, 2, 3}
使用Python 2.7引入了集合的语法.由于{}
已经使用了这么长时间,它将作为定义空字典的方式.如果Python从一开始就有了新的set语法,那么很可能会定义一个空集{}
和一个空字典{:}
.