据我所知,一个集合不可清除且一个元组是。然而,
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()
那么为什么当它是一组元组时不被允许呢?
答案 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
最好的问候 约翰内斯:)