2016-06-12 559 views
3

我正在阅读python http://www.python-course.eu/sets_frozensets.php中的集合,并对python中的集合的元素是否必须是可变的或不可变的感到困惑?因为在定义部分他们说“一个集合包含一个无序的唯一集合和不可变的对象。”如果它是真的,而列表是可变的,那么集合如何包含列表?python中的集合元素必须是可变的或不可变的?

有人能澄清我的疑问吗?

>>> x = [x for x in range(0,10,2)] 
>>> x 
[0, 2, 4, 6, 8]  #This is a list x 
>>> my_set = set(x) #Here we are passing list x to create a set 
>>> my_set 
set([0, 8, 2, 4, 6]) #and here my_set is a set which contain the list. 
>>> 
+0

一个集合不能包含一个列表。从该教程本身:_“集合以不允许可变对象的方式实现,下面的示例演示**我们不能将列表作为元素包含在列表中**”_ – Selcuk

+0

您只是对方式集合感到困惑(用'set([',后面是元素,后面跟'])'来打印(看到我的回答如何在没有指定的情况下获得相同的“列表”。 – Anthon

回答

4

当您通过set()构造内置任何迭代,它建立了一套出在迭代提供的元件。所以当你通过set()一个列表时,它会创建一个包含列表中的对象的集合 - 不是包含列表本身的集合,这是不允许的,因为列表是可变的。

因此,重要的是,列表中的对象是不可变的,在链接教程的情况下,您有一个(不可变的)字符串列表。

>>> set(["Perl", "Python", "Java"]) 
set[('Java', 'Python', 'Perl')] 

注意,这个打印格式并不意味着你的集包含一个列表,它是多么打印时集表示。例如,我们可以从一个元组创建一个集合,它将以相同的方式打印。

>>> set((1,2,3)) 
set([1, 2, 3]) 

在Python 2,套印刷作为set([comma-separated-elements])

1

你似乎混淆初始化一组与列表:

a = set([1, 2]) 

与添加列表,以现有的一组:

a = set() 
a.add([1, 2]) 

后者将抛出一个错误,其中前者初始化您提供的列表中的值作为参数提供。什么是最有可能的混乱的原因是,当你从第一个例子打印a它看起来像:

set([1, 2]) 
再次

,但这里[1, 2]是不是列表,只是表示的方式a

a = set() 
a.add(1) 
a.add(2) 
print(a) 

给出:

set([1, 2]) 

没有你曾经指定的列表。

+0

感谢兄弟澄清我的疑问。 –

相关问题