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 中的可变对象,如下所示:–
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”,如下所示:–
在使用 a=344 之后,有一个新的对象被引用为“a”。下图表示了相同的内容:–
因此,每当对 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 | 字典或关联映射 | 可变的 |