Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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_Python 3.x_Set - Fatal编程技术网

Python 为什么{}可以处理整数,而set()不能?

Python 为什么{}可以处理整数,而set()不能?,python,python-3.x,set,Python,Python 3.x,Set,当我在控制台中键入{5}时,得到的结果是一个集合: >>> {3} {3} 而set5会导致错误: >>> set(5) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'int' object is not iterable 。那么为什么会发生这种情况呢?因为: 它不需要单个单独的值,它需要一个iterable值

当我在控制台中键入{5}时,得到的结果是一个集合:

>>> {3}
{3}
而set5会导致错误:

>>> set(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
。那么为什么会发生这种情况呢?

因为:

它不需要单个单独的值,它需要一个iterable值。例如:

set([5, 6, 7])
在硬编码固定数量的值或变量时,将使用文字:

{'foo', bar, baz()}
当有一个iterable要解包到一个集合中时,可以使用set构造函数:

set(baz)
set(foo(bar) for bar in baz)
set(map(foo, baz))

在多个值上定义集合实例时,值不一定是具体的。例如,它们可以由生成器延迟计算:

values = (a%1 for a in range(2500000))
my_set1 = set(values)  # values can be *any* iterable type
这是内存有效的,因为集合最多只包含2个值。重复项在出现时被消除

如果set将采用单个值,则必须将lazy-iterable解压缩到临时元组中。中间元组将包含所有2500000个值

def inefficient_set(*items):  # items is an intermediate tuple
    return set(items)

values = (a%1 for a in range(2500000))
my_set2 = inefficient_set(*values)
使用set获取iterable时,只有在需要时才使用中间容器

定义多个值的文字集时,所有值都是具体的。类似地,当您定义一组惰性值时,这些值也是具体的

my_set3 = {0, 1, 0, 1, 0, 1}            # values are known to be concrete
my_set4 = {a%1 for a in range(2500000)} # values are known to be lazy
在这种情况下,需要iterable将需要一个无用的中间容器。由于{}接受单个值,因此只有在需要时才使用中间容器


要考虑的重要部分是{…}是语法而…是一个常规类型实例化。在Python中,语法是静态的,而类型是动态的。这允许静态地区分具体值的{a,b,c,}文本和{…for…in…}理解。

使用iterable,例如list,而不是整数,因为[3]和list3不一样。为什么?你是在问{}语法的优点,底层结构的差异,还是别的什么?@Snow{5}不是函数调用;它是一个集合文字,就像5是一个整型文字一样。集合可以被编写为接受任意数量的参数,因此set1,2,3=={1,2,3}和set5=={5},但随后您会遇到iterables集合的问题。当setab,cd显然是{ab,cd}时,setab应该是什么?是一个包含两个字母字符串的单集合,还是一个包含两个字母字符串的双元素集合?'k'也是一个单独的值,但set'k'会生成一个集合。你指的是数字数据类型吗?@Snow[5,6,7]也是一个单独的值,但它是一个iterable值k'也是一个iterable值,奇怪的是,它只包含一个字符串“k”。字符串在Python中很奇怪,因为它缺少一个独特的字符类型。set'foo'产生集合{'f','o'}。@chepner deceze理解它。谢谢这不是真的相关。另外,set可以在从惰性iterable读取副本时丢弃副本,但您也可以编写set[0,1,0,1,0,1]并获得一个两元素集。注意,您可以也可以编写一个集合理解…{a%1 for a in range2500000}@chepner重点是,如果set和{}以这种方式工作,您可以使用最佳路径,但您可以自由选择。如果它们以另一种方式工作,则无法使用最佳路径。@deceze理解的时间复杂度是否与范围2500000的a的seta%1相同?还是更低?@Snow无论哪种方式,复杂性都是相同的,实际上两者在幕后都是一样的——将生成器提供给set构造函数。但原则上,在您的情况下,set可以被重写。请注意,pypy可以将{}文本优化到使用set的速度的两倍左右。
my_set3 = {0, 1, 0, 1, 0, 1}            # values are known to be concrete
my_set4 = {a%1 for a in range(2500000)} # values are known to be lazy