我如何制作一组元组?

问题描述 投票:0回答:1

我知道集合不可散列,而元组则可。但是,

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

所以为什么它是一组元组时不允许使用?

python set
1个回答
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

最好的问候约翰内斯:)

© www.soinside.com 2019 - 2024. All rights reserved.