python中删除元素所涉及到的浅复制与深复制问题

比如我们现在有一个需求,需要键盘输入一组人员姓名和年龄的数据,每一行代表一条数据,想存储在一个二维列表中,以下有两种方式进行实现。

第一种:

n = int(input()) # 输入人数
data = []
for i in range(n):
    b = []
    s = input().split()
    b.append(str(s[0])) # 姓名
    b.append(int(s[1])) # 年龄
    data.append(b)

print(data)

假设输入人数是3,那得到的结果如下:

第二种:

n = int(input()) # 输入人数
data = []
b = []
for i in range(n):
    s = input().split()
    b.append(str(s[0])) # 姓名
    b.append(int(s[1])) # 年龄
    data.append(b)

    # 删除b列表元素,重新输入数据
    for j in range(len(b))[::-1]:
        b.pop(j)

print(data)

假设也是输入人数为3,得到的结果如下

方法二为什么会得不到数据呢?

难道列表删除元素之后,其他引用到该元素的列表中的元素也会被删除吗?

这里就不得不说浅复制和深复制的区别了。

浅复制(浅拷贝):复制的只是原对象元素的引用,换句话说,浅复制产生的对象本身是新的,但是它的内容不是新的,只是对原对象的一个引用。而上面代码中的“=”号复制就是浅复制的一种,只引用了其内容,而内存地址并不变,还是原来列表数据的地址,所以当删除了列表中数据时,也就没法引用了,所以方法二的结果为空列表。

深复制(深拷贝):深拷贝就是不但拷贝了内容,还分配了新的内存空间,此时删除原有数据,新列表的数据也不会被删除了。

那怎么使用深拷贝呢?

举了栗子(以下即为深拷贝):

a = [1]
b = a.copy()
a.remove(1)
print(b)

猜你喜欢

转载自blog.csdn.net/qq_36851515/article/details/83148863