Javatpoint标志
Javatpoint标志

Python可变与不可变数据类型

Python中的可变和不可变数据类型

可变或不可变是用来解释数据类型在初始化后能够更新的属性的花哨词。基本的解释是:可变对象的内部状态是可变的。相反,一旦在Python中创建了一个不可变对象,我们就不能以任何方式更改它。

什么是可变数据类型?

当任何东西都可以被修改或改变时,就说任何东西都是可变的。Python中的术语“mutable”指的是对象修改其值的能力。这些通常是保存数据集合的东西。

什么是不可变数据类型?

不可变指的是一种状态,在这种状态下,一段时间内不会发生任何变化。如果Python对象的值不能随时间变化,则它被称为不可变对象。这些Python对象的值在创建后是固定的。

可变和不可变对象的列表

Python可变数据类型:

  • 列表
  • 字典
  • 用户定义的类(取决于用户定义类的特征)

Python不可变数据类型:

  • 数字(整数,浮点数,复数,十进制,有理数和布尔)
  • 元组
  • 字符串
  • 冰冻的集

Python id()函数

当你定义一个Python对象时,程序会把一个内存段放在一边。每个Python对象都有一个不同的地址,用于通知应用程序该项在内存中的位置。

Python中的每个对象都有一个连接到该对象内存地址的独特ID。使用内置的Python id()函数读取特殊id。

让我们读取一个示例字符串对象在内存中的位置,例如:

代码

输出:

140452604995952

Python中的可变性

正如我们已经说过的,不可变的Python对象不能被改变。

在Python中,整数数据类型是不可变对象或数据类型的基本情况。让我们做一个简单的实验来理解这一点。

让我们首先创建两个整数变量,x和y。变量y是变量x的引用:

现在,x和y都指向内存中的同一个位置。换句话说,这两个整数变量应该具有ID()函数返回的相同ID。让我们确认这是真的:

代码

输出:

x和y具有相同的id: True

结果,变量x和y指向一个整数对象。换句话说,即使只有一个整数变量,也有两个变量指向它。

现在我们改变x的值。接下来,让我们再次比较x和y的引用id:

代码

输出:

x和y的id相同:False

这是因为x现在指向一个不同的整数对象。因此,整数变量3本身保持不变。但是,以前引用它的变量x现在将用户指向新的整数实体13。

因此,尽管看起来我们修改了原始的整数变量,但实际上并没有。在Python中,整数对象是一种不可变数据类型,这意味着整数对象一旦创建就不能更改。

让我们再次使用可变对象进行类似的测试。

例如,创建一个列表,并将其放在第二个变量中。然后,比较两个列表的引用id。然后,让我们对创建的列表进行一些更改。然后,让我们看看两个列表的引用id是否仍然一致:

代码

输出:

两个列表变量的id相同:True两个列表变量的id相同:True

此外,它们的引用id匹配。结果,列表对象num和l指向内存位置。这表明我们可以通过增加一个元素来显式地更改list对象。因此,列表数据结构必须是可变的。Python列表就是这样操作的。

Python中的可变对象示例

列表

由于它们的可变性质,列表可以通过合并赋值操作符或索引操作符来更改其内容。

我们来看一个例子。

代码

输出:

原始列表:['Python', 'Java', 23, False, 5.3]修改后的列表:['Python', 'Java', 'changed', False, 5.3]

字典

由于字典的可变性,我们可以通过实现内置函数更新或使用键作为索引来修改它们。

让我们看一个例子。

代码

输出:

原字典:{1:'a', 2: 'b', 3: 'c'}修改后的字典:{1:'a', 2: 'changed', 3: 'c'}

由于集合的可变性,我们可以使用内置函数(update)修改它们。

请看一个例子:

代码

输出:

原集合:{1,2,3,4}修改后的集合:{1,2,3,4,'b', 'a', 'c'}

不可变Python对象的例子

int

由于int在Python中是一种不可变的数据类型,我们不能更改或更新它。

正如我们之前了解到的,不可变对象在更新时都会移动它们的内存地址。

这里有一个例子:

代码

输出:

int类型更新前的内存地址:11531680 int类型更新后的内存地址:11532000

浮动

由于Python中的float对象是一种不可变的数据类型,我们不能更改或更新它。正如我们之前了解到的,不可变对象在更新时都会移动它们的内存地址。

这里有一个例子:

代码

输出:

更新前float的内存地址:139992739659504更新后float的内存地址:139992740128048

字符串

由于Python中的字符串是不可变的数据结构,我们不能添加或编辑任何数据。在修改字符串的任何部分时,我们遇到了声明字符串不可更改的警告。

这里有一个例子:

代码

输出:

TypeError Traceback(最近一次调用last)  in  3 string = 'hello peeps' 4 ----> 5 string[0] = 'X' 6 7 print(string) TypeError: 'str'对象不支持项分配

元组

因为Python中的元组本质上是不可变的,所以我们无法添加或修改它们的任何内容。这里有一个例子:

代码

输出:

--------------------------------------------------------------------------- TypeError回溯(去年)最近调用< ipython-input-5-e011ebc4971e > <模块> 5 6 #试图修改元组对象——> 7 tuple_ [0] = ' X ' 8打印(tulple_) 9 TypeError: tuple对象不支持项目分配

FrozenSet

与集合一样,冻结集也是不可变的数据结构。虽然集合的组件总是可以被改变,但这不能用frozenset完成。因此,在frozenSet中不能添加或更新任何内容。

这里有一个例子:

代码

输出:

--------------------------------------------------------------------------- TypeError回溯(去年)最近调用< ipython-input-1-2cafcda94faf > <模块> 6 7 #的值更新frozenset——> 8 fset[1] = 76 9打印(fset) 10 TypeError: frozenset对象不支持项目分配

下一个话题 Python方差函数





Youtube 观看视频请加入我们的Youtube频道:现在加入

反馈


帮助他人,请分享

脸谱网 推特 pinterest

学习最新教程


准备


热门的技术


B.Tech / MCA






Baidu
map