Why is it possible to replace sometimes set() with {}?

前端 未结 4 535
北海茫月
北海茫月 2020-12-11 00:27

In PyCharm, when I write:

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

it says \"Function call can be replaced with set literal\" so it repl

相关标签:
4条回答
  • 2020-12-11 00:45

    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}
    
    0 讨论(0)
  • 2020-12-11 00:45

    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
    
    0 讨论(0)
  • 2020-12-11 00:55

    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.

    0 讨论(0)
  • 2020-12-11 01:01

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

    In: f = 'FH'
    
    In: set(f)
    Out: {'F', 'H'}
    
    In: {f}
    Out: {'FH'}
    
    0 讨论(0)
提交回复
热议问题