Python 深拷贝、浅拷贝

时间:2022-03-13 02:19:13

本文章主要对深拷贝和浅拷贝进行说明

举例:
s1 = [1,1,2,3,4,5,6,8]
for i in lists:
    if i%2 != 0:
        lists.remove(i)
        print(lists)#结果为[1,2,4,6,8]
以上例子说循环删除list里面的数据的时候,结果会不正确

将上面的代码该为如下:
s1 = [1,1,2,3,4,5,6,8]
s2 = [1,1,2,3,4,5,6,8]#s1和s2内存地址不同,如果此处改为S2 = S1 则循环结果也不正确,因为S2 = S1只是拷贝了内存地址,两个列表的内存地址相同指的都是同一个数据

for i in s2:
    if i%2 != 0:
     s1.remove(i)
        print(s1)#结果为[2,4,6,8]
#print(id(s1))
#print(id(s2))#用id()方法可查看列表的内存地址
原因: 循环删除时下标从0开始,第二次循环时下标为1,第一次循环后列表值为[1,2,3,4,5,6,8] 下标从1开始取值取到了2,并不是1,所以循环删除list里面的数据时,结果会不正确; 修改后代码中循环列表s2删除列表s1就没问题

 二、深拷贝、浅拷贝

1、深拷贝:会重新开辟一块内存

import copy#深拷贝需要引入copy模块
s2.deepcopy(s1)#如例子中的s2 = [1,2,3,4,5,6,8]

2、浅拷贝:存的是同一块内存地址

s2 = s1