关于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);
Python中,浅复制深复制是用来创建对象副本的两种不同方式。 浅复制是创建一个新对象,该对象与原始对象共享相同的子对象。换句话说,浅复制复制了对象的顶层结构,而不会复制嵌套对象本身。可以使用浅复制来创建一个新的可变对象,该对象与原始对象具有相同的状态。在Python中,可以使用切片操作符[:]、copy()函数或copy模块的copy()函数实现浅复制。 下面是一个浅复制的示例: ```python import copy # 原始列表 original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 浅复制 shallow_copy = original_list.copy() # 修改副本中的子列表 shallow_copy[0][0] = 'A' print(original_list) # 输出: [[1,2, 3], [4, 5, 6], [7, 8, 9]] print(shallow_copy) # 输出: [['A', 2, 3], [4, 5, 6], [7, 8, 9]] ``` 深复制则是创建一个完全独立的新对象,包括所有嵌套对象。换句话说,深复制会递归地复制嵌套对象本身,而不是共享它们。可以使用copy模块的deepcopy()函数来实现深复制。 下面是一个深复制的示例: ```python import copy # 原始列表 original_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 深复制 deep_copy = copy.deepcopy(original_list) # 修改副本中的子列表 deep_copy[0][0] = 'A' print(original_list) # 输出: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(deep_copy) # 输出: [['A', 2, 3], [4, 5, 6], [7, 8, 9]] ``` 可以看到,深复制创建了一个全新的对象,修改副本中的子列表不会影响原始列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值