关于python:为什么有时可以用{}替换set()?

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

在Pycharm中,当我写:

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

它说"函数调用可以替换为set literal",因此它将其替换为:

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

为什么会这样?python中的set()与字典{}不同?

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


python集和字典都可以使用大括号构造:

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

my_set = {1, 2, 3}

口译员(和人类读者)可以根据他们的内容来区分他们。但是,不能区分空集和空dict,因此在这种情况下,需要使用set()来消除空集的歧义。

一个非常简单的测试表明文字结构更快(python3.5):

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

这个问题涵盖了在内置函数上执行文本构造的一些问题,尽管是针对列表和dict。总而言之,字面结构对解释器的工作要求较低。


它是set()的另一种语法。

1
2
3
4
5
6
7
8
9
10
11
12
>>> 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语法不同。它由键值对组成。例如:

1
my_obj = {1:None, 2:None}


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

1
2
3
4
5
6
7
In: f = 'FH'

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

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

set([iterable])是从可选的不可重复的iterable创建集合的构造函数。{}用于创建集合/dict对象文本。所以创建什么取决于您如何使用它。

[cc lang="python"]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