Python内存管理详解:深入理解浅拷贝与深拷贝
本文深入解析Python中的内存管理机制,重点对比浅拷贝与深拷贝的核心差异。通过代码示例展示对象赋值、浅拷贝及深拷贝在内存地址分配上的不同表现,阐明父对象与内层数据在两种拷贝方式下的独立性关系,帮助开发者避免因引用共享导致的数据意外修改问题。
本文重点探讨Python语言中内存使用的核心机制,具体围绕浅拷贝与深拷贝的概念及实现原理展开详细阐述。
浅拷贝的本质是对对象引用的复制,其操作范围仅限于父对象层级。
深拷贝则是对对象内部所有资源进行完整的独立复制,确保新对象与原对象完全隔离。
>>> a=[1,2,3,'a','b']
>>> b=a
>>> b
[1, 2, 3, 'a', 'b']
>>> a
[1, 2, 3, 'a', 'b']
>>> id(a)
3021737547592
>>> id(b)
3021737547592
>>> a.append('c')
>>> a
[1, 2, 3, 'a', 'b', 'c']
>>> b
[1, 2, 3, 'a', 'b', 'c']
>>> b.append(4)
>>> b
[1, 2, 3, 'a', 'b', 'c', 4]
>>> a
[1, 2, 3, 'a', 'b', 'c', 4]
通过上述操作观察可知:当将变量a直接赋值给变量b后,a与b指向同一内存地址。此时无论修改a还是b,另一个变量的内容都会随之同步变化,两者始终保持状态一致。
>>> import copy
>>> a=[1,2,3,['a','b','c']]
>>> b=a
>>> c=copy.copy(a)
>>> b
[1, 2, 3, ['a', 'b', 'c']]
>>> c
[1, 2, 3, ['a', 'b', 'c']]
>>> id(a)
3021737548104
>>> id(b)
3021737548104
>>> id(c)
3021737494536 #浅拷贝父对象的地址不一样
>>> a.append('d')
>>> a
[1, 2, 3, ['a', 'b', 'c'], 'd']
>>> b
[1, 2, 3, ['a', 'b', 'c'], 'd']
>>> c
[1, 2, 3, ['a', 'b', 'c']] #a和c的地址不一样,因此a变化,c不变化
>>> id(a[0])
1686357680
>>> id(c[0])
1686357680
>>> id(a[3])
3021737547528
>>> id(c[3])
3021737547528 #整个父对象所占的空间不一样,但相同的内层数据的所占空间一样
>>> a[3].append('d')
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']
>>> c
[1, 2, 3, ['a', 'b', 'c', 'd']]#因为内层数据所占空间一样,所以a变化,c跟着变化
以上演示了浅拷贝的行为特征:此时父对象的内存地址已不同,但内层数据的内存地址依然相同。因此,若操作内层数据,两个对象会一同发生变化;但若仅操作父对象本身,被拷贝的对象内容不会随之改变。
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']
>>> d=copy.deepcopy(a)
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']
>>> id(a)
3021737548104
>>> id(d)
3021737547656 #深拷贝父对象的地址不一样
>>> a.append('e')
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd', 'e']
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']#a和d的地址不一样,因此a变化,d不变化
>>> id(a[0])
1686357680
>>> id(d[0])
1686357680
>>> id(a[3])
3021737547528
>>> id(d[3])
3021737493256 #内层数据的地址不一样
>>> a[3].append('x')
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd', 'x'], 'd', 'e']
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']
以上演示了深拷贝的行为特征。
两者的主要区别如下:
浅拷贝与原对象的内层数据共享同一内存地址; 深拷贝则完全独立,与原对象在内存层面没有任何关联。
总结
以上就是本文关于Python内存使用(深浅拷贝)的全部内容,希望能为读者提供清晰的技术参考。感兴趣的朋友可继续浏览本站其他相关专题,如有疏漏欢迎留言指正,感谢支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









