Python内存管理:赋值、浅拷贝与深拷贝解析
赋值与共享资源
在Python中,直接赋值操作(如 list2 = list1
)会导致两个变量共享同一个内存地址。这意味着对 list1
的修改会直接影响到 list2
,因为它们指向同一个对象。
- 注意: 赋值等于完全共享资源
- 如果我们不希望这样完全共享,可以使用浅拷贝和深拷贝
- 导入copy模块
list1 = [1,2,3,4,5]
print(list1)
list2 = list1
print(list2)
list1.append(6)
print(list1)
print(list2)
浅拷贝
浅拷贝通过 copy.copy()
实现,它创建一个新的对象,但只拷贝第一层的数据。嵌套层的数据仍然指向原来的内存地址。
- 优点:拷贝速度快,占用空间少,拷贝效率高
import copy
list3 = [1,2,3,4,5,[6,7,8]]
list4 = copy.copy(list3)
print("list3内存地址:%s"%(id(list3)))
print("list4内存地址:%s"%(id(list4)))
print("list3内存嵌套地址:%s"%(id(list3[5])))
print("list4内存嵌套地址:%s"%(id(list4[5])))
list3.append(8)
list3[5].append(100)
print(list3)
print(list4)
深拷贝
深拷贝通过 copy.deepcopy()
实现,它完全拷贝所有层的数据,新对象与原对象完全不共享内存地址。
list5 = [1,2,3,4,5,[6,7,8]]
list6 = copy.deepcopy(list5)
print("list5内存地址:%s"%(id(list5)))
print("list6内存地址:%s"%(id(list6)))
print("list5内存嵌套地址:%s"%(id(list5[5])))
print("list6内存嵌套地址:%s"%(id(list6[5])))
list5.append(100)
list5[5].append(1000)
print(list5)
print(list6)
可变对象与不可变对象
可变对象(如列表、字典、集合)在修改时内存地址不变,
而不可变对象(如数值类型、字符串、元组)在修改时会生成新的对象,分配新的内存空间。
list7 = [1,2,3,4,5]
print("list7的原内存地址%s"%(id(list7)))
list7.append(5)
print("list7增加数据后的内存地址%s"%(id(list7)))int1 = 10
print("int1的原内存地址%s"%(id(int1)))
int1 = 100
print("int1的原内存地址%s"%(id(int1)))str1 = "hello"
print("str1的内存地址%s"%(id(str1)))
str1 = "nihao"
print("str1的内存地址%s"%(id(str1)))tuple1 = (1,2,3,4,5)
print("tuple1的内存地址%s"%(id(tuple1)))
tuple1 = (2,3,4,5,6)
print("tuple1的内存地址%s"%(id(tuple1)))