Почему можно заменить set() на {}?
В PyCharm, когда я пишу:
return set([(sy + ady, sx + adx)])
он говорит: "Функциональный вызов может быть заменен на заданный литерал", поэтому он заменяет его:
return {(sy + ady, sx + adx)}
Почему? A set()
в Python не совпадает с словарем {}
?
И если он хочет оптимизировать это, почему это более эффективно?
Ответы
Ответ 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