为什么有时候可以用{}代替 set() ?

在 PyCharm 中,当我写道:

return set([(sy + ady, sx + adx)])

上面写的是 “函数调用可以替换为字面值”所以换成了:

return {(sy + ady, sx + adx)}

为什么? 在 Python 中 set()和字典 {}是不一样的?

如果它想优化这个,为什么这个更有效?

32380 次浏览

It is an alternative syntax for set()

>>> a = {1, 2}
>>> b = set()
>>> b.add(1)
>>> b.add(2)
>>> b
set([1, 2])
>>> a
set([1, 2])
>>> a == b
True
>>> type(a) == type(b)
True

dict syntax is different. It consists of key-value pairs. For example:

my_obj = {1:None, 2:None}

Python sets and dictionaries can both be constructed using curly braces:

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

my_set = {1, 2, 3}

The interpreter (and human readers) can distinguish between them based on their contents. However it isn't possible to distinguish between an empty set and an empty dict, so this case you need to use set() for empty sets to disambiguate.

A very simple test suggests that the literal construction is faster (python3.5):

>>> timeit.timeit('a = set([1, 2, 3])')
0.5449375328607857
>>> timeit.timeit('a = {1, 2, 3}')
0.20525191631168127

This question covers some issues of performance of literal constructions over builtin functions, albeit for lists and dicts. The summary seems to be that literal constructions require less work from the interpreter.

set([iterable]) is the constructor to create a set from the optional iterable iterable. And {} is to create set / dict object literals. So what is created depends on how you use it.

In [414]: x = {}


In [415]: type(x)
Out[415]: dict


In [416]: x = {1}


In [417]: type(x)
Out[417]: set


In [418]: x = {1: "hello"}


In [419]: type(x)
Out[419]: dict

Another example how set and {} are not interchangeable (as jonrsharpe mentioned):

In: f = 'FH'


In: set(f)
Out: {'F', 'H'}


In: {f}
Out: {'FH'}