变量 = xxx 仅代表把变量指向xxx数据所在的存储空间。
比如a = [1,2,3]代表变量a指向[1,2,3]所在的存储空间。
python有两种数据类型:可变数据类型,不可变数据类型。区别在于内存中的值能否被修改。
id(变量)可以查看变量的内存地址。
1.1 可变数据类型:列表,字典(key不可变)列表:
# 列表 # 修改列表中的值,a变量的指向没有发生改变(可变数据类型) a = [1,2,3] print(id(a)) # 1949733739136 a.append(4) print(id(a)) # 1949733739136
字典:
# 字典 # 修改字典中的值,a变量的指向没有发生改变(可变数据类型) a = dict(name="zs", age=27) print(id(a)) # 2955544943680 a["sex"] = "male" print(id(a)) # 29555449436801.2 不可变数据类型:数字,字符串,元组
数字:
# 数字 # 修改数字的值,a变量的指向发生改变(不可变数据类型) a = 2 print(id(a)) # 140716966876864 a = 3 print(id(a)) # 140716966876896
字符串:
# 字符串 # 修改字符串的值,a变量的指向发生改变(不可变数据类型) a = "python" print(id(a)) # 2546802488816 a = "javascript" print(id(a)) # 2546802807088
元组:
# 元组 # 无法修改元组的值(不可变数据类型) a = (1,2,3) a[0] = 0 # 会报错,元组不可变2.拷贝可变类型数据 2.1 copy.copy(浅拷贝)
浅拷贝创建了新的内存空间:
import copy a = [1,2,3] b = copy.copy(a) print(id(a)) # 1977249421888 print(id(b)) # 1977249419712
因为是两个不同的内存空间,所以即使我们改变了a中的数据,b中的数据也不会发生改变:
import copy a = [1,2,3] b = copy.copy(a) a[0] = 0 print(a) # [0, 2, 3] print(b) # [1, 2, 3]2.2 copy.deepcopy(深拷贝)
深拷贝创建了新的内存空间:
import copy a = [1,2,3] b = copy.deepcopy(a) print(id(a)) # 2077998963392 print(id(b)) # 2077998961280
因为是两个不同的内存空间,所以即使我们改变了a中的数据,b中的数据也不会发生改变:
import copy a = [1,2,3] b = copy.deepcopy(a) a[0] = 0 print(a) # [0, 2, 3] print(b) # [1, 2, 3]2.3 总结
对于可变类型数据,copy.copy与copy.deepcopy都会重新创建新的内存空间。两者的区别体现在有子对象的情况。
- copy.copy不会为子对象创建新的内存空间。
- copy.deepcopy会为子对象创建新的内存空间。
2.3.1 copy.copy复制的子对象仍然会指向原来的子对象
import copy a = [1,2,[3,4,5]] b = copy.copy(a) print(id(a[2])) # 1690960124544 print(id(b[2])) # 1690960124544
所以当我们修改a中的子对象时,b中的子对象也会发生改变
import copy a = [1,2,[3,4,5]] b = copy.copy(a) a[2].append(6) print(a[2]) # [3, 4, 5, 6] print(b[2]) # [3, 4, 5, 6]
2.3.2 copy.deepcopy复制的子对象也会创建新的内存空间
import copy a = [1,2,[3,4,5]] b = copy.deepcopy(a) print(id(a[2])) # 2268926565056 print(id(b[2])) # 2268926767808
所以当我们修改a中的子对象时,b中的子对象不会发生改变
import copy a = [1,2,[3,4,5]] b = copy.deepcopy(a) a[2].append(6) print(a[2]) # [3, 4, 5, 6] print(b[2]) # [3, 4, 5]3.拷贝不可变类型数据 3.1 copy.copy(浅拷贝)
浅拷贝指向同一个内存空间
import copy a = 1 b = copy.copy(a) print(id(a)) # 140716966876832 print(id(b)) # 140716966876832
当我们修改a的值,a的指向发生改变,b中的值不变
import copy a = 1 b = copy.copy(a) a = 5 print(a) # 5 print(b) # 13.2 copy.deepcopy(深拷贝)
深拷贝指向同一个内存空间
import copy a = 1 b = copy.deepcopy(a) print(id(a)) # 140716966876832 print(id(b)) # 140716966876832
当我们修改a的值,a的指向发生改变,b中的值不变
import copy a = 1 b = copy.copy(a) a = 5 print(a) # 5 print(b) # 13.3 总结
对于不可变类型数据,copy.copy与copy.deepcopy均指向同一内存空间。



