总结
首先我们要明确一下:变量存储在栈内存,对象存储在堆内存。
浅拷贝:
- 不拷贝子对象的内容,只拷贝子对象的引用
- 可以使用Python内置函数copy()
深拷贝:
- 会连子对象的内存全部拷贝一份,对子对象的修改不会影响源对象
- 可以使用Python内置函数deepcopy()
详细讲解:
简述
在使用Python语言,通常都会面临对象赋值、参数传递的使用,为了更深入理解它们的底层原理。Python也像其他语言如Java一样引入了浅考本和深拷贝的概念。
首先我们要明确一下:变量存储在栈内存,对象存储在堆内存。
Python数据类型分为可变数据类型、不可变数据类型。
- 可变数据类型包括:List(列表)、Dictionary(字典)、Set(集合)
- 不可变数据类型包括:String(字符串)、Number(数字)、Tuple(元组)
浅拷贝:
- 不拷贝子对象的内容,只拷贝子对象的引用
- 可以使用Python内置函数copy(),
实例如下
a = [(10, 20), [30, 40]]
c = copy.copy(a)
print(id(a), id(c)) # 地址不相同
print(id(a[0]), id(c[0])) # 嵌套元组地址是一样的
print(id(a[1]), id(c[1])) # 嵌套列表地址是一样的
结果
2029353023040 2029353022784
2029350906432 2029350906432
2029353058368 2029353058368
深拷贝:
- 会连子对象的内存全部拷贝一份,对子对象的修改不会影响源对象
- 可以使用Python内置函数deepcopy()
实例如下
a = [{10, 20}, [30, 40]]
c = copy.deepcopy(a)
print(id(a), id(c)) # 地址不相同
print(id(a[0]), id(c[0])) # 嵌套集合地址是不一样的
print(id(a[1]), id(c[1])) # 嵌套列表地址是不一样的
结果:
2029666940480 2029666940224
2029666800960 2029666802080
2029666975808 2029666941696
如图
不可变对象中,可以有可变的子对象
t1 = (1, 2, [3, 4])
t1[2].append(5)
print(t1)
结果:(1, 2, [3, 4, 5])
参考: