python进阶笔记
- 一、python中的可变和不可变
- 二、简单可变类型拷贝
- 三、复杂可变类型拷贝
- 四、简单不可变类型拷贝
- 五、复杂不可变类型拷贝
- 六、切片拷贝,字典拷贝
- 六、import导入模块路径问题
- 七、import的reload加载问题
一、python中的可变和不可变
目标
可变、不可变是指内存中的那块空间是否可以被改变
1、可变类型,创建后可以继续修改对象的内容(值)
2、不可变类型,一旦创建就不可修改的对象(值)
二、简单可变类型拷贝
目标
1、Python的深浅拷贝
拷贝的作用
2、深浅拷贝具体代码实现
针对可变类型,深浅拷贝都会产生一个新的空间
copy()浅拷贝,产生新的空间,能够保证数据的独立性
import copy
list1=[1,2,3]
print("list1=",list1,id(list1))
#浅拷贝
list2=copy.copy(list1)
print("list2=",list2,id(list2))
#修改list1
list1.append(5)
print("list1=",list1,id(list1))
print("list2=",list2,id(list2))
结果为:
list1= [1, 2, 3] 2350069862720
list2= [1, 2, 3] 2350069864128
list1= [1, 2, 3, 5] 2350069862720
list2= [1, 2, 3] 2350069864128
总结
deepcopy()深拷贝,产生新的空间,能够保证数据的独立性
#深拷贝
list1=[1,2,3]
print("list1=",list1,id(list1))
list2=copy.deepcopy(list1)
print("list2=",list2,id(list2))
#修改list2
list2.append(7)
print("list2=",list2,id(list2))
print("list1=",list1,id(list1))
结果为:
list1= [1, 2, 3] 2533638211392
list2= [1, 2, 3] 2533641050048
list2= [1, 2, 3, 7] 2533641050048
list1= [1, 2, 3] 2533638211392
三、复杂可变类型拷贝
浅拷贝
import copy
A=[1,2,3]
B=[11,22,33]
C=[A,B]
print("A=",A,id(A))
print("B=",B,id(B))
print("C=",C,id(C))
print("C[0]=",C[0],id(C[0]))
#对复杂可变类型进行浅拷贝
#D产生了新的空间
D=copy.copy(C)
print("D=",D,id(D))
print("D[0]=",D[0],id(D[0]))
#修改A的值
A[0]=10
print("D[0]=",D[0],id(D[0]))
结果为:
A= [1, 2, 3] 1802054422656
B= [11, 22, 33] 1802051952448
C= [[1, 2, 3], [11, 22, 33]] 1802054424064
C[0]= [1, 2, 3] 1802054422656
D= [[1, 2, 3], [11, 22, 33]] 1802054542592
D[0]= [1, 2, 3] 1802054422656
D[0]= [10, 2, 3] 1802054422656
总结
#深拷贝
A=[1,2,3]
B=[11,22,33]
C=[A,B]
print("A=",A,id(A))
print("B=",B,id(B))
print("C=",C,id(C))
print("C[0]=",C[0],id(C[0]))
D=copy.deepcopy(C)
print("D=",D,id(D))
print("D[0]=",D[0],id(D[0]))
#修改A的值
A[0] = 10
print("A=", A, id(A))
print("D[0]=", D[0], id(D[0]))
结果为:
A= [1, 2, 3] 2464027445056
B= [11, 22, 33] 2464030281984
C= [[1, 2, 3], [11, 22, 33]] 2464030283456
C[0]= [1, 2, 3] 2464027445056
D= [[1, 2, 3], [11, 22, 33]] 2464030402624
D[0]= [1, 2, 3] 2464030402816
A= [10, 2, 3] 2464027445056
D[0]= [1, 2, 3] 2464030402816
总结
四、简单不可变类型拷贝
目标
不可变类型,不管是深拷贝还是浅拷贝,都不会开辟新的空间,而是直接引用了被拷贝的数据的地址
浅拷贝
import copy
tuple1=(1,2,3)
print("tuple1=",tuple1,id(tuple1))
tuple2=copy.copy(tuple1)
print("tuple2=",tuple2,id(tuple2))
结果为:
tuple1= (1, 2, 3) 2001449933952
tuple2= (1, 2, 3) 2001449933952
深拷贝
import copy
tuple1=(1,2,3)
print("tuple1=",tuple1,id(tuple1))
tuple2=copy.deepcopy(tuple1)
print("tuple2=",tuple2,id(tuple2))
结果为:
tuple1= (1, 2, 3) 2507813313536
tuple2= (1, 2, 3) 2507813313536
五、复杂不可变类型拷贝
1、不可变类型的深浅拷贝-嵌套类型
浅拷贝
import copy
A=[1,2,3]
B=[11,22,33]
C=(A,B)
print("C=",C,id(C))
D=copy.copy(C)
print("D=",D,id(D))
print("D[0]=",id(D[0]),"C[0]=",id(C[0]),"A=",id(A))
结果为:
C= ([1, 2, 3], [11, 22, 33]) 1572978640768
D= ([1, 2, 3], [11, 22, 33]) 1572978640768
D[0]= 1572981461312 C[0]= 1572981461312 A= 1572981461312
深拷贝
import copy
A=[1,2,3]
B=[11,22,33]
C=(A,B)
print("C=",C,id(C))
D=copy.deepcopy(C)
print("D=",D,id(D))
print("D[0]=",id(D[0]),"C[0]=",id(C[0]),"A=",id(A))
结果为:
C= ([1, 2, 3], [11, 22, 33]) 2603209148288
D= ([1, 2, 3], [11, 22, 33]) 2603211969920
D[0]= 2603212080064 C[0]= 2603211970112 A= 2603211970112
六、切片拷贝,字典拷贝
1、切片拷贝
A=[1,2,3]
B=[11,22,33]
C=(A,B)
print("C=",C,id(C))
D=C[:]
print("D=",D,id(D))
结果为:
C= ([1, 2, 3], [11, 22, 33]) 1814156363648
D= ([1, 2, 3], [11, 22, 33]) 1814156363648
底层为浅拷贝方式
2、字典拷贝
import copy
dict1={"age":[1,2]}
print("dict1=",dict1,id(dict1))
dict2=dict1.copy()
print("dict2=",dict2,id(dict2))
dict1['age'][0]=100
print("dict1=",dict1,id(dict1))
print("dict2=",dict2,id(dict2))
结果为:
dict1= {'age': [1, 2]} 2850238566144
dict2= {'age': [1, 2]} 2850241455552
dict1= {'age': [100, 2]} 2850238566144
dict2= {'age': [100, 2]} 2850241455552
底层为浅拷贝
dict1['age'][0]=100
print("dict1=",dict1,id(dict1))
print("dict2=",dict2,id(dict2))
结果为:
dict1= {'age': [1, 2]} 2850238566144
dict2= {'age': [1, 2]} 2850241455552
dict1= {'age': [100, 2]} 2850238566144
dict2= {'age': [100, 2]} 2850241455552
底层为浅拷贝
六、import导入模块路径问题
目标
存在的问题:
原因:
解决方法:
注意:
七、import的reload加载问题
目标
存在的问题:
解决方案