09_Python深拷贝、浅拷贝
一、循环列表,删除其中的元素
l1 = [1,2,3,4,5,6,7] 循环删除奇数位元素
1.正序循环删除,会出现越界情况,所以采用倒叙的方式删除
1 l1 = [1,2,3,4,5,6,7] 2 for i in range(len(l1) - 1,-1,-1): 3 if i % 2 == 1: 4 l1.pop(l1[i]) 5 6 print(l1)
二、循环字典,删除其中的元素
如果循环删除的话,编译器会报 RuntimeError: dictionary changed size during iteration
1 #错误代码 2 #dic = {'k1':'zhangsan','k2':'lisi','k3':'wangwu','name':'xiaoming'} 删除带k的key 3 dic = {'k1':'zhangsan','k2':'lisi','k3':'wangwu','name':'xiaoming'} 4 5 for i in dic: 6 if 'k' in i: 7 del dic[i] 8 9 print(dic)
真确的方式,是把key放到一个列表中,然后根据列表元素进行删除
1 #正确的代码 2 dic = {'k1':'zhangsan','k2':'lisi','k3':'wangwu','name':'xiaoming'} 3 l1 = [] 4 for i in dic: 5 if 'k' in i: 6 l1.append(i) 7 8 for i in l1: 9 del dic[i] 10 11 print(dic)
三、深拷贝、浅拷贝
浅拷贝
3.1赋值就是指向同一块内存空间
str是不可变类型,所以当修改的时候会替换旧的对象,产生一个新的地址。
str1 = 'zhangsan' str2 = str1 #两个地址相同 str1 = 'lisi' print(id(str1)) print(id(str2))
3.2列表拷贝
l1 = [1,2,3,4] l2 = l1.copy() l1.append('5') print(l1,id(l1)) print(l2,id(l2))
3.3列表嵌套拷贝
l1 = [1,2,[44,55,66],3,4] l2 = l1.copy() l1[2].append('5') print(l1,id(l1)) print(l2,id(l2))
对于浅拷贝,第一层是独立的内存块,从第二层嵌套开始,都是指向同一个内存地址,一变都变
l1 = [1,2,[44,55,66],3,4] l2 = l1.copy() l1[2].append('5') print(l1,id(l1)) print(l2,id(l2)) print(l1,id(l1[2])) print(l2,id(l2[2]))
深拷贝
对于深拷贝来说,无论多少层,在内存中都是两个独立的内存块。
import copy l1 = [1,2,[44,55,66],3,4] l2 = copy.deepcopy(l1) l1[2].append('5') print(l1,id(l1)) print(l2,id(l2)) print(l1,id(l1[2])) print(l2,id(l2[2]))