### Python新手学习可变与不可变对象 #### 引言 在Python编程中,了解对象的可变性是非常重要的概念之一。对象是否可变决定了它如何在内存中被处理,进而影响程序的行为逻辑。本文将深入探讨Python中的可变对象与不可变对象,并通过实例来帮助读者更好地理解这些概念。 #### 什么是可变对象与不可变对象? 在Python中,对象分为两大类:可变对象和不可变对象。 - **不可变对象**:一旦创建后其值就不能更改的对象。如果尝试更改其值,则会创建一个新的对象。不可变对象包括`int`, `float`, `string`, `tuple`等类型。 - **可变对象**:创建后其值可以更改的对象。对这类对象进行修改不会创建新的对象,而是直接修改原有的对象。常见的可变对象包括`list`, `dict`等。 #### 不可变对象详解 不可变对象的一个典型特征是,即使两个变量指向同一个对象,在对其进行修改时也不会影响另一个变量指向的对象。这是因为Python会为新值创建一个新的对象,并让变量指向这个新对象。 ##### 示例 考虑以下代码示例: ```python def int_test(): i = 77 j = 77 print(id(77)) # 输出:140396579590760 print('iid:' + str(id(i))) # 输出:iid:140396579590760 print('jid:' + str(id(j))) # 输出:jid:140396579590760 print(i is j) # 输出:True j = j + 1 print('newiid:' + str(id(i))) # 输出:newiid:140396579590760 print('newjid:' + str(id(j))) # 输出:newjid:140396579590736 print(i is j) # 输出:False if __name__ == '__main__': int_test() ``` **分析:** - 初始时,`i`和`j`都指向值为`77`的对象,它们的内存地址相同。 - 当我们执行`j = j + 1`时,实际上是创建了一个新的整数对象`78`,并让`j`指向这个新对象,而不是修改原有`77`对象的值。 - 因此,`i`和`j`现在分别指向不同的对象,其内存地址也不同。 #### 可变对象详解 可变对象与不可变对象的关键区别在于可以直接修改其内部状态而不必创建新对象。这使得它们非常适合用来存储可能会变化的数据结构,如列表或字典。 ##### 示例 接下来,我们来看一个涉及可变对象的例子: ```python def dict_test(): a = {} b = a print(id(a)) # 输出:140367329543360 a['a'] = 'hhhh' print('ida:' + str(id(a))) # 输出:ida:140367329543360 print('a:' + str(a)) # 输出:a:{'a': 'hhhh'} print('idb:' + str(id(b))) # 输出:idb:140367329543360 print('b:' + str(b)) # 输出:b:{'a': 'hhhh'} if __name__ == '__main__': dict_test() ``` **分析:** - 初始时,`a`是一个空字典,`b`指向`a`所指向的内存空间。 - 当我们向`a`添加键值对`{'a': 'hhhh'}`时,`b`也会反映出这一变化,因为它指向的是同一个字典对象。 - 这一行为展示了可变对象的特性——直接修改现有对象,而不是创建新的对象。 #### Python函数参数传递机制 Python中函数的参数传递遵循“引用传递”的原则。这意味着传递给函数的是变量所指向对象的引用(而非值)。因此,如果传递的是可变对象,那么在函数内部对该对象的任何修改都会影响原始对象;而如果是不可变对象,则不会产生这种效果。 ##### 示例 以下代码演示了这一原理: ```python def test(a_int, b_list): a_int = a_int + 1 b_list.append('13') print('innera_int:' + str(a_int)) print('innerb_list:' + str(b_list)) if __name__ == '__main__': a_int = 5 b_list = [10, 11] test(a_int, b_list) print('outera_int:' + str(a_int)) print('outerb_list:' + str(b_list)) ``` **输出结果:** ``` innera_int:6 innerb_list:[10, 11, '13'] outera_int:5 outerb_list:[10, 11, '13'] ``` **结论:** - 对于`a_int`(不可变对象),虽然在函数内部进行了修改,但原变量不受影响,因为创建了一个新的整数对象。 - 对于`b_list`(可变对象),在函数内部的修改直接影响了原变量,因为直接修改了列表对象本身。 #### 总结 掌握Python中可变对象与不可变对象的区别对于编写高效且易于维护的代码至关重要。不可变对象在安全性方面具有优势,因为它们不会被意外地修改;而可变对象则更适合处理动态数据结构的需求。理解这些概念有助于避免潜在的错误和提高代码质量。
- 粉丝: 6
- 资源: 917
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助