关于python切片浅复制和深复制

本文详细解析Python中列表切片操作与深浅复制的区别,通过实例展示浅复制下引用类型的问题及解决方案,适合初学者巩固基础知识。

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

刚上了第二周python课,这节课是关于python序列之列表的
整理一下自己在学习过程中遇到困惑的地方,自用。

首先python中有一个符号[:]
这个符号的作用是切片复制,它不同于赋值,只是将数组的值复制过去,但是其内存地址是不同的。

a = [1,2,3];
b =a ;
print(a is b );控制台输出结果为True

a = [1,3,4];
b = a[:]; 切片复制数组的值给b
print(b);
print(a is b);控制台输出结果False

为什么会出现这样的结果,那是因为第二部分,b = a [:]
此时我们在其下面再输入

print(id(a));
print(id(b));

则会得到两个不同的地址,这就是为什么print(a is b)输出为False的原因。

zhang = [‘san’ ,[‘age’,20]];
li = zhang[:];
print(li is zhang);控制台输出False

li[0] = ‘si’;
li[1][1] = 30;
print(li) ;控制台输出['si',['age',30]]
print(zhang);控制台输出['san',['age',30]]

这时候我们发现,变量zhang的年龄数值被污染了,也变成了 30。这就是浅复制。

  1. 浅复制 只拷贝父对象,不会拷贝对象的内部的子对象。
  2. 深复制 拷贝对象及其子对象因

为切片仅仅复制了第一层,而一开始变量zhang就是个嵌套数组,所以第二层的数据并没有被复制,在第二层数据它们使用这同一块内存地址,所以zhang的年龄数值就会被污染。改进方法如下:

zhang = [‘san’ ,[‘age’,20]];
li = zhang[:];
li[1] = zhang[1][:];新增的代码行
print(li is zhang);

li[0] = ‘si’;
li[1][1] = 30;
print(li);控制台输出['si',['age',30]]
print(zhang);控制台输出['san',['age',20]]

以上就是第二周我稍有疑惑的地方,还有个通用深复制循环我没有实现出来,QAQ等我理解了再补充上来


jaijia师兄给了我一个模板作为参考,自用//w//方便复习

def my_deepcopy(arr):
    rt = [];
    for item in arr:
        if isinstance(item,list):
            rt.append(my_deepcopy(item))
        else:
            rt.append(item)
    return rt

if __name__ == '__main__':
    a = [1,2,'3',[4,5,'6']]
    b = my_deepcopy(a);
    b[3][2] = 'test';
    print (a);
    print (b);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值