Waarom is het mogelijk om soms set() te vervangen door {}?

In PyCharm, als ik schrijf:

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

er staat “Functie-aanroep kan worden vervangen door set literal”dus wordt deze vervangen door:

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

Waarom is dat? Een set()in Python is niet hetzelfde als een woordenboek {}?

En als het dit wil optimaliseren, waarom is dit dan effectiever?


Antwoord 1, autoriteit 100%

Python-sets en woordenboeken kunnen beide worden gemaakt met accolades:

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

my_set = {1, 2, 3}

De tolk (en menselijke lezers) kunnen ze onderscheiden op basis van hun inhoud. Het is echter niet mogelijk om onderscheid te maken tussen een lege set en een lege dict, dus in dit geval moet je set()gebruiken om lege sets ondubbelzinnig te maken.

Een zeer eenvoudige test suggereert dat de letterlijke constructie sneller is (python3.5):

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

Deze vraagbehandelt enkele problemen met de prestaties van letterlijke constructies boven ingebouwde functies, zij het voor lijsten en dictaten. De samenvatting lijkt te zijn dat letterlijke constructies minder werk van de tolk vergen.


Antwoord 2, autoriteit 8%

Het is een alternatieve syntaxis voor 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

dictsyntaxis is anders. Het bestaat uit sleutel-waardeparen. Bijvoorbeeld:

my_obj = {1:None, 2:None}

Antwoord 3, autoriteit 3%

set([iterable])is de constructor om een ​​set te maken van de optionele itereerbare iterable. En {}is om set / dict object letterlijke waarden te maken. Dus wat er wordt gemaakt, hangt af van hoe je het gebruikt.

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

Antwoord 4, autoriteit 3%

Nog een voorbeeld hoe seten {}niet uitwisselbaar zijn(zoals jonrsharpe al zei):

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

Other episodes