Python 中的可变与不可变对象 {示例}

什么是可变对象?

Python 中的可变对象可以定义为本质上可以更改或被视为可更改的对象。可变意味着修改或编辑值的能力。

Python 中的可变对象允许程序员拥有可以更改其值的对象。它们通常用于存储数据集合。它可以被视为已变异的事物,对象内的内部状态已发生变化。

什么是不可变对象?

Python 中的不可变对象可以定义为不会随时间改变其值和属性的对象。
这些对象一旦创建和初始化就成为永久的,它们构成了 Python 中数据结构的关键部分。

Python 用于数字、元组、字符串、冻结集以及某些例外情况下的用户定义类。它们不会改变,其值在初始化后保持不变,因此称为不可变。

在 Python 中,万物皆对象

在 Python 编程语言中,万物皆可视为对象,包括列表、整数和函数。此功能可与其他支持对象的编程语言进行比较。

可以使用 Python 解释器验证此功能,如下所示:–

Python 代码

print("The following instance is an object:",isinstance(3,object))
print("Another instance for object", isinstance(True, object))
def my_func():
    return "guru99"
print("This is a function example and regarded as an object in Python:", isinstance(my_func, object))

输出

A following instance is an object: True
Another instance for object True
This is a function example and regarded as an object in Python: True

此外,Python 提供了一个名为 id 的内置函数,它返回对象在 Python 编程语言内存中的地址。

Python 代码

z=200
id(z)
print("The id of object is", id(z))

输出

the id of object is 9795360

在上面的代码中,具有 id(obj) 语法的 id 函数给出 obj 在 Python 内存中的地址。这里,有一个名为 z 的对象,它被赋值为 200。然后将对象 z 传递给 id 函数,即 id(z),Python 返回对象地址为 9795360。

Python 中的可变对象

在可变对象中,对象的值会随着时间而变化。

在此示例中,我们解释了 Python 中的可变对象,它将列表用作可变对象的应用程序,如下所示:–

Python 代码

mut_list = [1, 2, 3]
  print("The list in Python",mut_list)
mut_list[0] = 'Gurru99'
mut_list
  print("The list in Python after changing value",mut_list)

输出

The list in Python [1, 2, 3]
The list in Python after changing value ['Gurru99', 2, 3]

如上面的示例所示,Python 中的可变列表的值为 1、2、3。可变列表的第一个元素从 1 更改为 Guru99,并且在初始化新值时不会创建新对象。

这里我们可以使用 id 方法来利用它。以下说明了 id 方法在可变对象中的用法,如下所示:–

Python 代码

mut_list = [1, 2, 3]
print("The list in Python",mut_list)
print("the id of the list is ",id(mut_list))
mut_list[0] = 'Gurru99'
mut_list
print("The mut list in Python after changing value",mut_list)
print("the id of the list is post change in value",id(mut_list))

输出

The list in Python [1, 2, 3]
the id of the list is 139931568729600
The list in Python after changing value ['Gurru99', 2, 3]
the id of the list is post change in value 139931568729600

下图说明了 Python 中的可变对象,如下所示:–

Mutable objects in Python

Python 中的不可变对象

Python 中的不可变对象是实例随时间不变的对象。特定类型的不变实例一旦创建就不会改变,并且可以使用 Python 的 id 方法来验证这一点。

让我们以 Python 中的整数类型对象为例,来说明 Python 中不可变对象的概念,如下所示:–

Python 代码

a=244
print("the number before change is",a)
print("the id of number before change is",id(a))
a=344
print("the number after change is",a)
print("the id of number after change is",id(a))

输出

the number before a change is 244
the id of number before change is 9796768
the number before change is 344
the id of number before change is 140032307887024

从上面可以看出,“a”发生了变化。让我们研究一下机制是如何工作的

  • 当“a”初始化为 344 时,对象的值没有变化。
  • 取而代之的是,创建了一个新对象并将其绑定到“a”。
  • 分配为 244 的其他对象将不再可访问。
  • 以上示例使用了整数对象。

在 a=244 时,会创建一个新对象并将其引用给“a”,如下所示:–

Immutable objects in Python

在使用 a=344 之后,有一个新的对象被引用为“a”。下图表示了相同的内容:–

Immutable objects in Python

因此,每当对 int 类型名称进行新值赋值时,名称与另一个对象的绑定就会发生变化。相同的原理适用于元组、字符串、浮点数和布尔值,因此称为不可变。

对 Python 字典键的影响

字典可以定义为有序集合,以键格式存储数据,不允许重复。字典包含一个键,该键具有与之对应的键值对。它们是可变类型,即使在初始化和创建后也可以更改其内容。

在任何时候,键都指向一个特定的元素。字典的键是不可变的。

让我们以一个假设场景为例,如下所示:–

a = [4, 6]
b = [5, 6, 7]
my_dict = {a: 'x', b: 'y'}
print(my_dict)

输出:– 上面的 Python 代码不产生任何输出,而是生成一个不可哈希类型的 TypeError。这是一个假设情况,不用于 Python 编译器。

这里,a 定义为 [4,6],在字典中定义为 x。这里,b 定义为 [5,6,7],在字典中定义为 y。

  • 键 'a' 的值为 [4,6],并进一步初始化为 x。
  • 键 'b' 的值为 [5,6,7],在字典中进一步初始化为 'y'。
  • 现在假设 'a' 的值附加了 5 和 7,这是字典的键。
  • 然后字典被修改,它将为上述字典提供 'x''y' 作为值。

考虑上面的场景,如下所示:–

a = [5, 6,7]
b = [5, 6, 7]
my_dict = {a: 'x', b: 'y'}
print(my_dict)

因此,作为一种编程语言,Python 使字典的键不可变,而字典是不可变的数据类型。

不可变性的例外

然而,Python 对不可变性提供了一些例外,例如元组对象类型。元组可以是可变和不可变对象类型的组合。让我们以一个例子来说明不可变性的例外,如下所示:–

Python 代码

tupexample=([1,1],'guru99')
print("the tuple before change",tupexample)
print("the id of tuple before change",id(tupexample))
tupexample=([2,2],'guru99')
print("the tuple after change",tupexample)
print("the id of tuple after change",id(tupexample))

输出

the tuple before change ([1, 1], 'guru99')
the id of tuple before change 140649480694656
the tuple after change ([2, 2], 'guru99')
the id of tuple after change 140649480694592

您可以在上面的代码中看到,第一个元素(列表)是可变的,而元组是不可变的。元组的值不能更改,但元组内的列表内容可以更改其值。

因此,这引起了一个例外,即不可变对象不改变其值,但其组成部分的值会改变其值。

可变与不可变对象

以下是可变对象和不可变对象之间的主要区别

可变对象 不可变对象
对象状态创建后可更改 对象状态创建后不可更改
可变对象本质上不被认为是线程安全的。 不可变对象被认为是线程安全的。
可变对象未被最终确定,因此程序员可以继续更改可变对象并使用相同的对象。 创建不可变对象时,使类最终至关重要。

Python 不可变数据类型

解释 可变或不可变
布尔值 布尔值 不可变的
Int 整数值(大小可任意) 不可变的
Float 浮点数 不可变的
列表 可变性质的对象序列 可变的
元组 不可变性质的对象序列 不可变的
Str 字符/字符串 不可变的
设置 由无序的、不重复的对象组成的集合 可变的
Frozenset 不可变性质的集合类 不可变的
Dict 字典或关联映射 可变的