Python可变对象、不可变对象与浅拷贝、深拷贝

本文深入探讨Python中可变与不可变对象的区别,以及引用指向、浅拷贝与深拷贝的工作原理。通过实例说明不同拷贝方式对对象的影响,帮助理解Python内存管理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://www.cnblogs.com/sun-haiyu/p/7096918.html

一,Python中的可变对象和不可变对象


不可变对象

该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。


可变对象

该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。
Python中,

不可变类型:数值类型(int和float)、字符串str、元组tuple

可变类型:列表list、字典dict、集合set

 

https://www.jianshu.com/p/03dce38cc97e

二,引用指向、深拷贝与浅拷贝

引用指向

 例如:

a = [1, 2]
b = a

这种赋值id(a) = id(b),不论可变数据类型还是不可变数据类型

 

浅拷贝,copy模块里面的copy方法实现

1、对于 不可 变类型 Number String Tuple,浅复制仅仅是地址指向,不会开辟新空间。
2、对于 可 变类型 List、Dictionary、Set,浅复制会开辟新的空间地址(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的),进行浅拷贝
3、浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象的;改变原始对象中为不可变类型的元素的值,只有原始类型受影响。(操作拷贝对象对原始对象的也是同理)

4、list[:]、dict.copy()类似于浅拷贝操作。


深拷贝,copy模块里面的deepcopy方法实现

1、如果每一层都是不可变类型,深拷贝依然拷贝的是引用,不会创建新的内存。

2、如果有一层是可变对象,则深拷贝会拷贝每一层,新建内存。

 

总结:

1、如果变量内部的数据每一层都是不可变类型,深拷贝和浅拷贝都是地址指向

2、如果变量最外层是可变类型,浅拷贝会拷贝最外层,开辟新的空间,id改变;深拷贝会拷贝所有的可变类型,开辟新的空间,id改变。

3、如果变量数据的最外层是不可变类型,内部包含有可变数据,浅拷贝会对最外层做地址指向,id不变;深拷贝开辟新的空间,id改变,并拷贝内部所有的可变类型。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值