首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第7章 编程术语
7.1 编程术语定义
7.1.1 作为语言的Python和作为解释器的Python
7.1.2 垃圾回收
7.1.3 字面量
7.1.4 关键字
7.1.5 对象、值、实例和身份
7.1.6 项
7.1.7 可变和不可变
7.1.8 索引、键和哈希值
7.1.9 容器、序列、映射和集合类型
7.1.10 特殊方法
7.1.11 模块和包
7.1.12 可调用对象和头等对象
7.2 经常被混淆的术语
7.2.1 语句和表达式
7.2.2 块、子句和主体
7.2.3 变量和特性
7.2.4 函数和方法
7.2.5 可迭代对象和迭代器
7.2.6 语法错误、运行时错误和语义错误
7.2.7 形参和实参
7.2.8 显式类型转换和隐式类型转换
7.2.9 属性和特性
7.2.10 字节码和机器码
7.2.11 脚本和程序,以及脚本语言和编程语言
7.2.12 库、框架、SDK、引擎、API
第8章 常见的Python陷阱
8.1 循环列表的同时不要增删其中的元素
8.2 复制可变值时务必使用copy.copy()和copy.deepcopy()
8.3 不要用可变值作为默认参数
8.4 不要通过字符串连接创建字符串
8.5 不要指望sort()按照字母顺序排序
8.6 不要假设浮点数是完全准确的
8.7 不要使用链式!=运算符
8.8 不要忘记在仅有一项的元组中添加逗号
第9章 Python的奇特难懂之处
9.1 为什么256 是256,而257 不是257
9.2 字符串驻留
9.3 假的Python 增量运算符和减量运算符
9.4 传递空列表给all()
9.5 布尔值是整数值
9.6 链式使用多种运算符
9.7 Python 的反重力特性
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(三)
小册名称:Python编程轻松进阶(三)
### 7.1.7 可变和不可变:深入理解Python数据类型 在Python编程的广阔天地中,数据类型是基础而核心的概念。理解数据类型的特性,尤其是它们是否可变(mutable)或不可变(immutable),对于编写高效、可维护的代码至关重要。本章将深入探讨Python中的可变与不可变数据类型,解析它们之间的区别、应用场景以及如何正确地在编程实践中使用它们。 #### 7.1.7.1 可变与不可变数据类型概述 在Python中,数据类型根据其是否可以在创建后修改其值被分为两大类:可变数据类型(mutable)和不可变数据类型(immutable)。 - **不可变数据类型**:一旦创建,其值就不能被改变。尝试修改不可变类型的数据会创建一个新的对象,而原对象保持不变。Python中的不可变数据类型主要包括:整型(int)、浮点型(float)、字符串(str)和元组(tuple)。 - **可变数据类型**:与不可变数据类型相反,可变数据类型在创建后,其值可以被修改。这意味着你可以在不创建新对象的情况下改变其内部状态。Python中的可变数据类型主要有列表(list)、字典(dict)和集合(set)。 #### 7.1.7.2 不可变数据类型的深入剖析 ##### 字符串(str) 字符串是Python中最常用的不可变数据类型之一。字符串一旦创建,其包含的字符序列就不能被改变。尝试修改字符串中的字符会抛出TypeError。例如: ```python s = "hello" s[0] = 'H' # TypeError: 'str' object does not support item assignment ``` 不过,可以通过字符串切片和拼接等操作来创建新的字符串,模拟修改的效果: ```python s = "hello" new_s = s[:1] + 'H' + s[1:] # new_s = 'Hello' ``` ##### 元组(tuple) 元组是另一种不可变的数据结构,它用于存储序列化的数据项,但与列表不同的是,元组一旦创建就不能被修改(即不能添加、删除或替换其中的元素)。元组在表示不应改变的数据集时非常有用,例如,表示点的坐标、数据库查询的结果等。 ```python t = (1, 2, 3) t[1] = 4 # TypeError: 'tuple' object does not support item assignment ``` 但是,如果元组中的元素是可变的(如列表),那么这些元素内部的状态是可以改变的,但元组本身的结构(即包含哪些元素)仍然是不变的。 ```python t = (1, [2, 3], 4) t[1].append(5) # 合法操作,t变为(1, [2, 3, 5], 4) ``` #### 7.1.7.3 可变数据类型的详细探讨 ##### 列表(list) 列表是Python中最常用的可变数据类型之一,用于存储序列化的数据项。列表支持增加(append、insert)、删除(remove、pop、del)和修改(直接通过索引赋值)等操作。 ```python lst = [1, 2, 3] lst.append(4) # lst变为[1, 2, 3, 4] lst[1] = 'a' # lst变为[1, 'a', 3, 4] ``` 列表的可变性使其成为处理动态数据集(如用户输入、数据处理结果等)的理想选择。 ##### 字典(dict) 字典是Python中另一种重要的可变数据类型,用于存储键值对。字典支持添加、删除和修改键值对,但不支持通过索引直接访问元素(而是通过键来访问)。 ```python d = {'a': 1, 'b': 2} d['c'] = 3 # 添加键值对 del d['a'] # 删除键值对 d['b'] = 'B' # 修改键值对 ``` 字典的可变性使其成为存储和管理复杂数据结构的强大工具,特别是在需要快速检索和更新数据时。 ##### 集合(set) 集合是一个无序的、不包含重复元素的数据结构。集合主要用于数学中的集合运算,如并集、交集、差集和对称差集等。集合是可变的,可以添加和删除元素,但不能直接修改元素(因为集合中的元素是唯一的,修改元素实质上等同于添加或删除)。 ```python s = {1, 2, 3} s.add(4) # 添加元素 s.remove(2) # 删除元素 # s变为{1, 3, 4} ``` #### 7.1.7.4 可变与不可变数据类型的性能考量 理解数据类型的可变性对于优化程序性能也至关重要。由于不可变数据类型在修改时会创建新对象,这可能导致额外的内存分配和复制操作,从而影响性能。然而,不可变数据类型也带来了一些优势,如线程安全性和作为字典键的能力(因为不可变对象在内存中是不可变的,所以可以作为哈希表的键)。 相比之下,可变数据类型在修改时不会创建新对象,因此可以节省内存和时间。但是,这也带来了额外的复杂性,特别是在多线程编程中,因为可变对象的状态可能在不同线程之间被意外修改。 #### 7.1.7.5 应用场景与最佳实践 - **使用不可变数据类型**:当需要保证数据不可变时(如配置文件、常量值等),或者当数据将作为哈希表的键时,应优先考虑使用不可变数据类型。 - **使用可变数据类型**:当需要动态修改数据集时(如处理用户输入、管理状态等),可变数据类型是更好的选择。 - **避免不必要的复制**:在处理大数据集时,应尽量避免不必要的复制操作,特别是当使用不可变数据类型时。可以通过使用切片(对于列表)或字典推导式(对于字典)等技巧来优化性能。 - **注意线程安全**:在多线程环境中,应谨慎使用可变数据类型,以避免数据竞争和条件竞争等问题。可以考虑使用锁(如threading.Lock)或其他同步机制来保护共享数据。 #### 结语 可变与不可变数据类型是Python编程中的核心概念之一。深入理解它们的特性和应用场景,对于编写高效、可维护的代码至关重要。通过合理使用可变和不可变数据类型,我们可以更好地控制程序的行为和性能,从而编写出更加优雅和强大的Python程序。希望本章的内容能够帮助读者更好地掌握这一重要概念,并在实际编程中灵活运用。
上一篇:
7.1.6 项
下一篇:
7.1.8 索引、键和哈希值
该分类下的相关小册推荐:
Python机器学习基础教程(上)
Python数据分析与挖掘实战(上)
Python高并发编程与实战
Python编程轻松进阶(二)
Python机器学习基础教程(下)
Python合辑11-闭包函数
剑指Python(磨刀不误砍柴工)
Python高性能编程与实战
Python合辑5-格式化字符串
Python合辑2-字符串常用方法
Python3网络爬虫开发实战(上)
Python与办公-玩转PPT