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