Python可变与不可变对象及赋值机制详解
本文解析Python中可变(list/dict/set)与不可变(tuple/string/int等)对象的底层原理,阐明Python采用传对象引用的参数传递方式。重点对比=、copy与deepcopy在内存引用层面的差异,结合代码实例说明浅层复制与深层复制对嵌套可变对象的影响,并简述引用计数垃圾回收机制。
Python可变与不可变对象原理
一、原理
- 可变对象主要包括:list(列表)、dict(字典)、set(集合)。
- 不可变对象主要包括:tuple(元组)、string(字符串)、int(整数)、float(浮点数)、bool(布尔值)。
Python参数传递机制
1. Python不允许程序员手动选择传值或传引用,其参数传递机制固定为“传对象引用”。这实际上是传值与传引用的综合体现:若函数接收的是可变对象的引用,则可直接修改原对象值,行为类似“传引用”;若接收的是不可变对象的引用,则无法直接修改原对象,行为类似“传值”。
2. 当对可变对象进行复制操作时,仅复制了该对象的引用。若修改该引用的值,将直接反映并修改原始参数对象。
3. 为简化内存管理,Python采用引用计数机制实现自动垃圾回收。每个对象均维护一个引用计数,记录该对象被引用的次数。每次引用对象时计数加1,每次销毁引用时计数减1;仅当引用计数归零时,Python才会真正从内存中删除该对象。
赋值与复制方法的具体应用
二、具体应用
1. = 赋值、copy 方法与 deepcopy 方法的差异
使用 = 进行赋值时,并不会创建新对象,变量 b 和 a 指向的是内存中的同一个对象。
使用 copy 方法会创建一个新的外层对象,此时 b 和 a 指向不同的对象地址;但对象内部包含的可变对象(如列表 y)仍引用原对象的同一内存地址。这意味着 copy 仅执行浅层复制,内部可变对象不会新建,而是直接复用原对象。
使用 deepcopy 方法不仅创建新的外层对象,还会递归地创建内部所有可变对象。因此,deepcopy 执行的是深层复制,确保新对象与原对象完全独立。
代码实例
=、copy与deepcopy代码验证
# = 赋值
a = {'x': 11, 'y': [22, 33]}
b = a
print(id(a))
>>> 1630605400840
print(id(b))
>>> 1630605400840
# copy 方法
a = {'x': 11, 'y': [22, 33]}
b = a.copy()
print(id(a))
>>> 2357161715536
print(id(b))
>>> 2357161715608
print(id(a['y']))
>>> 140720772330640
print(id(b['y']))
>>> 140720772330640
# deepcopy 方法
import copy
a = {'x': 11, 'y': [22, 33]}
b = copy.deepcopy(a)
print(id(a))
>>> 2357161715536
print(id(b))
>>> 2357161715608
print(id(a['x']))
>>> 140720772330640
print(id(b['x']))
>>> 140720772330640
print(id(a['y']))
>>> 2462852627784
print(id(b['y']))
>>> 2462852628232
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









