如何制作一组集合的元组?

时间:2016-10-06 00:04:42

标签: python set

据我所知,一个集合不可清除且一个元组是。然而,

a = ({1, 2, 3}, {2, 3, 5})
b = ({1, 7}, {3, 0})
{a, b}

返回TypeError:不可用类型:' set'。 为什么会这样?

编辑: 是的,集合是可变的,因此不可用。然而,元组虽然是不可变的,但它们的元素可以改变价值并且仍然可以保持可用。像这样:

class I() :
    __init__(self, value) :
        self.value = value
    __incr__(self) :
        self.value += 1
tup = (I(), I())
tup[0].incr()

那么为什么当它是一组元组时不被允许呢?

1 个答案:

答案 0 :(得分:0)

正如您已经正确提到的那样,Python具有可修改和不可更改的数据类型。同样正确的是,集合是可变的数据类型,而元组是不可更改的数据类型。 但是,这仅适用于元组的第一个级别,而不适用于更深的级别,因此对于您的对象而言并非如此。

让我们用一个例子来说明这个原理:

t = ([1,1],[2,2])
id(t) # --> 2588744372096

o我们有一个元组t,其中包含两个列表。现在可以假定该元组无法更改,因为尽管可以更改列表,但是元组不能更改。内部发生以下情况:元组不直接包含两个列表,但是在元组中,指针存储在列表中。因此,索引0处的元组元素是指向列表[1,1]的指针,位置1是指向列表[2,2]的指针。因此,我们可以随意更改列表而无需更改元组,因为它仅包含不变的指针。因此,让我们更改第一个列表的第一个元素:

t[0][0] = 3
print(t) # --> ([3,1],[2,2])
id(t) # --> 2588744372096

从相同的元组ID可以看到,它仍然是相同的元组,元组的内容(指针)也没有改变。

您可以查看网站pythontutor.com,该网站也以图形方式显示了该方面。图形可视化效果也可以在这里找到:Click me。有关指针的更多信息,请参见:Information about pointers

最好的问候 约翰内斯:)