我正在阅读python http://www.python-course.eu/sets_frozensets.php中的集合并且混淆了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 :(得分:4)
当你传递内置任何 iterable 的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 :(得分: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])
没有指定列表。