哪个 Python 数据结构是不可变的?28 Aug 2024 | 5 分钟阅读 在深入了解哪些数据结构是可变的,哪些是不可变的数据结构之前,我们先简要讨论一下可变性和不可变性的概念。 可变数据结构可变数据类型是程序执行后可以进一步修改或更改的数据类型。假设我们将变量赋值为 10,然后单击执行按钮。如果我们要将该变量的值更新为 12a(可变),那么我们可以更改该变量的值。在程序中更新变量的次数没有限制,除非我们对其施加其他类型的限制。在这些可变数据结构中,数据可以进一步更改、覆盖、替换以前的数据并用新内容更新数据结构。可变数据类型是可以适应、更改和通过删除元素、添加数据元素或替换任何数据项来更改的数据项。 不可变数据结构不可变数据类型是程序执行后不能进一步更改或修改的数据类型。假设我们将变量赋值为 10,单击执行按钮。之后,如果我们要将该不可变变量的值更新为 12,那么我们无法更改该变量的值,直到我们再次创建该变量。对该变量进行操作没有解决方案。 某些数据类型是不可变的,在执行程序后无法进一步更改,例如 int、float、bool、string、Unicode、tuple。 当您希望防止多个人在并行编程中同时修改一段数据时,不可变数据结构非常方便。可变数据结构(例如,数组)可以随时更改,而不可变数据结构则不能。 Python 的默认数据结构是可变的,这是一个明智的设计决策,就最小意外而言,但理解可变结构的初始化和状态很难,尤其是在像 Python 这样自由允许重新分配的语言中,它的执行方式更像脚本而不是编译语言。 不可变数据结构是答案。Python 通过 命名元组 本地支持一些不可变性。但是,这些更适合替换对象而不是列表和字典等数据结构。 Python 中不可变的数据结构Python 中的元组元组是逗号分隔的 Python 对象的集合。元组在索引、重复和嵌套对象方面与列表相似。但在这里,列表是可变的,可以根据程序员的需要进一步更改。 Python 程序更改元组内的值 输出 (0, 1, 2, 3, 4, 5) --------------------------------------------------------------------------- TypeError Traceback ( most recent call last) <ipython-input-1-b8d5fc013374> in <module>() 3 t = ( 0, 1, 2, 3, 4, 5 ) 4 print(t) ----> 5 t[0]=3 6 print(t) TypeError: 'tuple' object does not support item assignment. 如果我们观察上面的程序,将索引 0 的值从 0 更改为 3 是不可能的,因为元组是不可变的。 让我们用列表执行相同的程序,然后尝试相应地观察变化 Python 程序更改列表内的值 输出 <class 'list'> [0, 1, 2, 3, 4, 5] [3, 1, 2, 3, 4, 5] 如果我们将上面的元组示例与列表进行比较,我们可以轻松地更新列表中的数据项,而元组则不能。在元组中,如果我们要对数据项进行任何更改,我们无法这样做,因为元组数据结构不支持对其数据项的更改。 现在让我们尝试从元组中删除任何数据项 Python 程序删除元组内的值 输出 <class 'tuple'> (12, 13, 15, 2, 7, 9) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-6-53a7b72542d3> in <module>() 2 print(type(t)) 3 print(t) ----> 4 del t[0] TypeError: 'tuple' object doesn't support item deletion. 在上面的元组示例中,我们试图通过删除索引 0 处的值来对元组执行删除操作。但是,如果我们观察到我们无法执行删除操作,元组数据结构不支持删除操作。 让我们将元组数据类型与列表进行比较,以上面的删除示例作为测试用例。 Python 程序删除列表内的值 输出 <class 'list'> [12, 13, 15, 2, 7, 9] [13, 15, 2, 7, 9] 在上面的列表示例中,我们可以轻松地观察到我们可以删除特定索引位置处的特定数据项。与元组相比,我们无法删除元组数据类型中特定位置处的项。如上面的示例所示,我们正在尝试删除索引 0 处的数据项,并且我们可以成功删除它。 让我们尝试在程序中删除整个元组数据结构。 Python 程序删除整个元组 输出 <class 'tuple'> (12, 13, 15, 2, 7, 9) --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-13-4c727775f4a1> in <module>() 5 print(t) 6 del t ----> 7 print(t) 8 NameError: name 't' is not defined 在上面的示例中,如果我们尝试观察,我们可以轻松地从程序中删除整个元组,但我们无法删除元组的一部分,这意味着我们无法删除元组特定索引位置处的特定值。因此,删除整个元组成功执行,但从元组中删除特定值是不可能的。 现在让我们尝试使用 append 函数将数据元素添加到元组中 Python 程序在元组内添加数据元素 输出 <class 'tuple'> (12, 13, 15, 2, 7, 9) --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-1-170ba378b342> in <module>() 4 print(type(t)) 5 print(t) ----> 6 t.append(9) 7 print(t) 8 AttributeError: 'tuple' object has no attribute 'append.' 在上面的示例中,如果我们要使用 append 函数将数据元素添加到元组中,我们无法将数据元素添加到元组中。这意味着元组不支持 append 函数。 现在让我们在列表中执行相同的操作 Python 程序在元组内添加数据项 输出 <class 'list'> [0, 1, 2, 3, 4, 5, 9] [3, 1, 2, 3, 4, 5, 9] 下一主题map 使用的数据结构是什么 |
我们请求您订阅我们的新闻通讯以获取最新更新。