Подтвердить что ты не робот

Почему можно заменить set() на {}?

В PyCharm, когда я пишу:

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

он говорит: "Функциональный вызов может быть заменен на заданный литерал", поэтому он заменяет его:

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

Почему? A set() в Python не совпадает с словарем {}?

И если он хочет оптимизировать это, почему это более эффективно?

4b9b3361

Ответ 1

Наборы Python и словари могут быть построены с использованием фигурных скобок:

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

my_set = {1, 2, 3}

Интерпретатор (и человеческие читатели) может различать их по их содержанию. Однако невозможно различать пустой набор и пустой dict, поэтому в этом случае вам нужно использовать set() для пустых наборов, чтобы устранить неоднозначность.

Очень простой тест показывает, что литеральная конструкция быстрее (python3.5):

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

Этот вопрос охватывает некоторые проблемы выполнения литералов по встроенным функциям, хотя и для списков и dicts. Сводка, похоже, заключается в том, что литературные конструкции требуют меньше работы от переводчика.

Ответ 2

Это альтернативный синтаксис для 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 отличается. Он состоит из пар ключ-значение. Например:

my_obj = {1:None, 2:None}

Ответ 3

set([iterable]) - это конструктор для создания набора из необязательного итеративного iterable. И {} - создавать литералы объектов set/dict. Итак, что создано, зависит от того, как вы его используете.

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