Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么有时可以将set()替换为{}?_Python_Set - Fatal编程技术网

Python 为什么有时可以将set()替换为{}?

Python 为什么有时可以将set()替换为{}?,python,set,Python,Set,在PyCharm中,当我写道: return set([(sy + ady, sx + adx)]) 它说“函数调用可以替换为set literal”,因此它将其替换为: return {(sy + ady, sx + adx)} 为什么呢?Python中的set()不同于字典{} 如果它想对此进行优化,为什么会更有效?这是set()的另一种语法 dict语法不同。它由键值对组成。例如: my_obj = {1:None, 2:None} Python集和字典都可以使用大括号构造: my_

在PyCharm中,当我写道:

return set([(sy + ady, sx + adx)])
它说“函数调用可以替换为set literal”,因此它将其替换为:

return {(sy + ady, sx + adx)}
为什么呢?Python中的
set()
不同于字典
{}


如果它想对此进行优化,为什么会更有效?

这是
set()的另一种语法

dict
语法不同。它由键值对组成。例如:

my_obj = {1:None, 2:None}

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

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

my_set={1,2,3}

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

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

介绍了一些关于文字结构在内置函数上的性能问题,尽管是针对列表和dict。总结似乎是文字构造需要较少的解释器工作。

set([iterable])
是从可选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

另一个例子是
set
{}
如何不可互换(如Jornsharpe所述):


请注意,尽管有标题,但不能将
set()
替换为
{}
,但可以将非空的
集((1,2,3))
替换为文本
{1,2,3}
,因为现在很明显,这不是字典。请看,文字结构可能更快,因为您没有构建中间列表;如果你把这个因素考虑进去会怎么样?@jornsharpe似乎还是比较慢:
timeit.timeit(stmt='a=set(mylist)'setup='mylist=[1,2,3]')->0.3987466390244663
-我想我添加的链接涵盖了其中的一些。哇,在Python3.8中,尝试你的测试,差异是令人印象深刻的:
0.1970
vs
0.0705
set(f)的功能带有文本的
必须使用解包:
{*f}
。永远不可能将
集合(sometuff)
替换为
{sometuff}
。但是只要源代码中的
sometuff
不是0个字符,就可以用
{sometuff}
替换
set([sometuff])
。由于OP使用的是
set([somestuff])
,而
somestuff
不是0个字符,因此可以进行替换。当您说
set([iterable])
时,您是指出现的是文字字符
[
]
?或者您是否使用ABNF表示
iterable
是函数
set()
的可选参数?因为第一种情况是错误的,第二种情况是正确的。这很令人困惑,因为很多人会读到这篇文章,认为你指的是第一个案例。
>>> timeit.timeit('a = set([1, 2, 3])')
0.5449375328607857
>>> timeit.timeit('a = {1, 2, 3}')
0.20525191631168127
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
In: f = 'FH'

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

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