day5_不能循环删除list-深拷贝、浅拷贝(import copy)
一、循环删list里面的元素,会导致下标错位,结果是不对的举例:想删除奇数
l = [1,1,1,2,3,4,5] for i in l: if i%2 !=0: l.remove(i) #删除后,导致下标错位了,有的值被错过了不会被删除。 print(l)
结果:
[1, 2, 4]
可解决方式:
l = [1,1,1,2,3,4,5] l2 = [1,1,1,2,3,4,5] #在定义个l2和l相同 for i in l2: #循环的是l2 if i%2 !=0: l.remove(i) #删除的是l print(l)
结果:
[2, 4]
list里面的copy()方法也是浅拷贝
引发出问-深拷贝、浅拷贝
二、深拷贝、浅拷贝
深拷贝会开辟新的内存地址,浅拷贝不会用一个内存地址
l = [1,1,1,2,3,4,5] #跟深拷贝一样
l2 =l #浅拷贝#这种不行,l存的实际是内存地址,l2又定义了个变量,把l赋值给l2,说明l2指向的内存地址和l相同。l删除后,l2也删除了,因为用的是一块儿内存地址
查看内存地址;print(id(l))
import copy #引入模块-深拷贝功能
1、‘=’:用等号来赋值,新的变量和原来的变量实际上指向的是同一个地址,等号连接起来的变量互相影响
2、浅拷贝copy
注:import copy后使用的copy函数和python自带的copy函数作用是相同的(copy.copy(x)=x.copy())
拷贝原list变量的第一层,之后对新变量或者旧变量的第一层的修改不会影响到彼此,第二层以及更多层之间则是像第一中操作中一样,是互相影响的。什么是第一层呢
l =[1,2,[3,4]]
那么1,2,[3,4]都属于第一层的元素,在新变零中修改第一层的元素不会影响到原变量,同样,在原变量中修改第一层的元素也不会影响到新变量;而3,4属于第第二层中的元素,对他们修改会影响到用浅拷贝连接起来的所有变量中的第二层元素:
修改原变量观察对新变量的影响:
import copy
l =[1,2,[3,4]] l2 = copy.copy(l) #copy()函数, l3 = l.copy() #列表自带的copy()方法 l[0] =0 l[2][0]=9 print('l=',l) print('l2=',l2) print('l3 =',l3)
输出:
l= [0, 2, [9, 4]] l2= [1, 2, [9, 4]] l3 = [1, 2, [9, 4]]
修改新变量,对原变量的影响:
l =[1,2,[3,4]] l2 = copy.copy(l) #copy()函数, l3 = l.copy() #列表自带的copy()方法 l2[0] =0 l2[2][0]=9 print('l=',l) print('l2=',l2) print('l3 =',l3)
输出:
l= [1, 2, [9, 4]] l2= [0, 2, [9, 4]] l3 = [1, 2, [9, 4]]
3、深拷贝deepcopy
复制出来的与原来的变量没有任何关系,最清爽的复制
import copy l = [1,1,1,2,3,4,5] l2 = copy.deepcopy(l) #深拷贝 print(id(l)) print(id(l2))
结果:
18649160 18553288
字符串/元组的拷贝问题说明:字符串是不可变的。
a = '小黑' b = a #重新开辟了新内存,不会像list一样,和a用一个内存地址 a = '小白' #a重新复制不会互相影响 print(a) print(b)
输出:
小白
小黑