深浅拷贝
深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表、元组、字典等其他数据类型。
数字和字符串
对于数字
和字符串
而言,赋值、浅拷贝和深拷贝无意义,因为他们的值永远都会指向同一个内存地址。
# 导入copy模块 >>> import copy # 定义一个变量var1 >>> var1 = 123 # 输出var1的内存地址 >>> id(var1) 1347747440 >>> var2 = var1 # var2的内存地址和var1相同 >>> id(var2) 1347747440 # 浅拷贝 >>> var3 = copy.copy(var1) # var3的内存地址和var1相同 >>> id(var3) 1347747440 # 深拷贝 >>> var4 = copy.deepcopy(var1) # var4的内存地址和var1相同 >>> id(var4)
1347747440
其他数据类型
对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
- 创建一个字典
var1
var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}
赋值
赋值,只是创建一个变量,该变量指向原来内存地址,如:
>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]} >>> var2 = var1 >>> id(var1) 1937003361288 >>> id(var2) 1937003361288
如图所示:
浅拷贝
浅拷贝,在内存中只额外创建第一层数据
# 导入拷贝模块 >>> import copy >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]} # 使用浅拷贝的方式 >>> var2 = copy.copy(var1) # 两个变量的内存地址是不一样的 >>> id(var1) 2084726354952 >>> id(var2) 2084730248008 # 但是他们的元素内存地址是一样的 >>> id(var1["k1"]) 2084726207464 >>> id(var2["k1"]) 2084726207464
如图所示:
深拷贝
深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)
# 导入拷贝模块 >>> import copy >>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]} # 使用深拷贝的方式把var1的内容拷贝给var2 >>> var2 = copy.deepcopy(var1) # var1和var2的内存地址是不相同的 >>> id(var1) 1706383946760 >>> id(var2) 1706389852744 # var1和var2的元素"k3"内存地址是不相同的 >>> id(var1["k3"]) 1706389853576 >>> id(var2["k3"]) 1706389740744 # var1和var2的"k3"元素的内存地址是相同的 >>> id(var1["k3"][1]) 1706383265744 >>> id(var2["k3"][1]) 1706383265744
如图所示:
import copy # 对数字 字符串 # a = 1 # b = a # # print(id(a) == id(b)) # b = 12 # print(a, b) # print(id(a) == id(b)) # a = 'aa' # b = copy.copy(a) # print(a, b) # print(id(a) == id(b)) # # b = 'bb' # print(a, b) # print(id(a) == id(b)) # c = copy.deepcopy(a) # print(a, c) # print(id(a) == id(c)) # # c = 'cc' # print(a, c) # print(id(a) == id(c))\ # a = [1, 2, 3, 4, 5] # # b = a # # b[1] = 5 # print(a, b) # print(id(a) == id(b)) # # a = [1, 2, 3, 4, 5, [1, 2]] # b = copy.copy(a) # print(a, b) # print(id(a) == id(b)) # print(id(a[1]) == id(b[1])) # print(id(a[5]) == id(b[5])) # b[1] = 10 # print(a[1]) # print(id(a[1]) == id(b[1]) ) # # print('----------') # print(id(a[5][0]) == id(b[5][0])) # b[5][0] = 50 # print(a[5][0]) # print(id(a[5][0]) == id(b[5][0])) a = [1, 2, 3, 4, 5, [5, [[1,2],8]], {'a': 'aa'}] b = copy.deepcopy(a) print(id(a) == id(b)) print(id(a[3]) == id(b[3])) print(id(a[5]) == id(b[5])) # b[3] = 20 # print(a, b ) print(id(a[5][1][0][1]) == id(b[5][1][0][1])) b[5][1][0] = 20 print(a[5][1][0])
优秀的深浅拷贝博客https://www.cnblogs.com/fandx/p/10462913.html?tdsourcetag=s_pctim_aiomsg