Python 可变 & 不可变数据类型

文章介绍了 Python 中的可变和不可变数据类型,包括整数、浮点数、布尔值、字符串、元组、冻结集合、列表、字典和集合。讨论了不可变类型如何提高程序运行效率和保证数据安全性,以及可变类型如何通过动态调整内存空间来管理数据。文章还解释了为什么不可变类型是字典键的要求,并分析了不可变和可变类型的实现机制。

在 Python 语言中,数据类型大致可以分为可变和不可变两种。以下是它们的一些例子:
不可变数据类型

  • 整数(int):如 2、3、4、5。
  • 浮点数(float):如 2.3、4.6、5.0。
  • 布尔(bool):True 或 False。
  • 字符串(str):如 ‘hello’、’world’。
  • 元组(tuple):如 (1, 2, 3)。元组内的元素不可变。
  • 冻结集合(frozenset):如 frozenset([1,1,2,3,4])。

可变数据类型

  • 列表(list):如 [1, 2, 3]。列表元素可以增加或删除。
  • 字典(dict):如 {‘name’: ‘Tom’, ‘age’: 20}。字典的键值对可以新增或修改。
  • 集合(set):如 {1,2,3,4}。集合元素可以增加或删除。

需要注意的是,不可变并不代表赋值以后就不能改变了,里面的值可以改变,就比如元组,元组一旦创建就不能改变,但是如果元组里面嵌套的是一个列表就能改变了,因为改变的是列表。就像家的门是不能换的,但是家里的人是可以随时变的

Python 中的不可变类型和可变类型都有各自的重要性,二者的存在使得 Python 在处理不同的数据时更加灵活。

为什么要有不可变类型:

  1. 提高程序运行效率:由于 Python 的不可变类型在被创建后不允许修改,这意味着可以预先知道它们的长度,位置等信息,这为底层优化提供了可能,可以大大提高程序的运行速度。
  2. 保证数据安全性:不可变类型的数据不能被修改,可以放心地传递和使用,不用担心被误修改,增加代码的稳定性和可靠性。
  3. 作为字典的键:在 Python 中,字典的键需要是可哈希的,也就是不可变的,所以不可变类型的对象可以作为字典的键。

不可变类型是如何实现的:

不可变类型的实现基于 Python 的内存管理机制,当你创建了一个不可变类型的对象后,Python会为其分配一个固定的内存空间来保存它,该空间的内容是不可以改变的。如果你尝试去更改这个对象的值,Python 实际上是创建了一个新的对象和新的内存,而旧的内存块如果没有引用会被 Garbage Collector 回收。

可变类型是如何实现的:

对于可变类型的对象,Python 在初始化时并不会立即分配内存来存储值,而是为其创建一个可动态调整大小的内存空间,当你向其中添加元素时,Python 会改变这个空间的大小。如果你尝试更改它,Python 将在原地修改,而不是创建新的对象。

1
2
3
4
5

"可动态调整大小的空间"是指计算机内存中的一块特定区域,它可以根据实际存储需要进行动态的扩展和收缩。
对于像列表或字典这样的可变类型数据结构,它们会预分配一些额外的存储空间用于存储未来可能加入的元素。当这些预分配的空间不足以存放新的元素时,Python会重新分配一块更大的空间,并将原来的元素复制到新的空间中。这个新的空间通常是原来空间的两倍大小,这也是为什么列表和字典的增长是非线性的。
同时,当列表或字典中的元素被删除,空间利用率降低后,Python可能会收缩这块空间,释放不用的内存。
总的来说,"可动态调整大小的空间"就是用来优化数据存储,有效利用和管理计算机内存的一种策略。

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def ed(args):
if type(args) == list:
args.append('world')
if type(args) == dict:
args['b'] = 'world'
if type(args) == int:
args = args + 1


ed(a1)
ed(a2)
ed(a3)

print(a1)
print(a2)
print(a3)


--> 输出
123
['123', 'world']
{'a': 123, 'b': 'world'}

logo.svg

作者

默吟

发布于

2024-04-24

更新于

2024-12-02

许可协议

CC BY-NC-SA 4.0

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×