Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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中的集合元素必须是可变的还是不可变的?_Python_Set - Fatal编程技术网

python中的集合元素必须是可变的还是不可变的?

python中的集合元素必须是可变的还是不可变的?,python,set,Python,Set,我在阅读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)

我在阅读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.
>>> 
当您传递任何iterable中内置的构造函数时,它将构建iterable中提供的元素集。因此,当您传递
set()
列表时,它会创建一个包含列表中对象的集合,而不是包含列表本身的集合,这是不允许的,因为列表是可变的

因此,重要的是列表中的对象是不可变的,这在链接教程中是正确的,因为您有一个(不可变)字符串列表

>>> set(["Perl", "Python", "Java"])
set[('Java', 'Python', 'Perl')]
请注意,这种打印格式并不意味着您的集合包含列表,它只是在打印时集合的表示方式。例如,我们可以从一个元组创建一个集合,并以相同的方式打印它

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

在Python 2中,集合被打印为
集合([
逗号分隔的元素
])

您似乎把初始化集合与列表混淆了:

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])

没有指定列表。

集合不能包含列表。从该教程本身来看:“集合是以一种不允许可变对象的方式实现的。下面的示例演示了我们不能将示例列表作为元素包含”您只是被集合的打印方式(与
set([
,后跟元素,后跟
])
搞混了。请参见我的答案如何获得相同的结果“列表”没有详细说明。谢谢老兄澄清我的疑问。