可变对象和不可变对象 Python {示例}
什么是可变对象?
可变的 Python 可以定义为可以改变的对象或被视为本质上可变的东西。可变意味着修改或编辑值的能力。
中的可变对象 Python 使程序员能够拥有可以改变其值的对象。它们通常用于存储数据集合。它可以被视为已经变异的东西,并且对象内适用的内部状态已经改变。
什么是不可变对象?
不可变对象 Python 可以定义为不会随时间改变其值和属性的对象。
这些对象一旦创建并初始化,就成为永久对象,并且它们构成了 Python.
Python 用于数字, 元组、字符串、冻结集和用户定义类(但有一些例外)。它们无法改变,并且一旦初始化,它们的值和内容将保持不变,因此称为不可变的。
In 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 函数的语法为 id(obj),它给出了 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.
让我们以整数类型对象为例 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”发生了变化。让我们研究一下这个机制是如何工作的:
- 当用344初始化“a”时,对象的值没有变化。
- 相反,会创建一个新对象,并用“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 代码不会产生任何输出,而是生成一个不可哈希类型的类型错误。这是一种假设情况,在 Python 编译器。
在这里, a
定义为 [4,6],在字典中定义为 x。这里, b
定义为[5,6,7],在字典中定义为y。
- 键 'a' 的值为 [4,6],并且进一步初始化为 x。
- 键“b”的值为 [5,6,7],在字典中进一步初始化为“y”。
- 现在假设'一种' 附加了 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
您可以在上面的代码中看到,第一个元素(列表)是可变的,而元组是不可变的。元组的值不能更改,但元组中的列表的内容可以更改其值。
因此,这引发了一个异常,即不可变对象的值不会改变其值,但组成部分的值会改变其值。
可变对象与不可变对象
以下是可变对象和不可变对象之间的主要区别:
可变对象 | 不可变对象 |
---|---|
对象状态一旦创建就可以改变 | 对象状态一旦创建就无法改变 |
可变对象本质上不被视为线程安全的。 | 不可变对象本质上被视为线程安全的。 |
可变对象不是最终的,因此程序员可以不断改变可变对象并使用相同的对象。 | 在创建不可变对象时,将类设为 final 至关重要 |
Python 不可变数据类型
增益级 | 说明 | 是否不可变 |
---|---|---|
布尔 | 布尔值 | 不可变的 |
诠释 | 整数值(大小可以是任意的) | 不可变的 |
Float | 浮点数 | 不可变的 |
列表 | 可变性质的对象序列 | 可变的 |
元组 | 不可变性质的对象序列 | 不可变的 |
STR | 字符/字符串 | 不可变的 |
选择 | 一组具有无序性质的不同对象 | 可变的 |
冰雪奇缘 | 不可变性质的集合类 | 不可变的 |
字典 | 字典或关联映射 | 可变的 |