python基础-深浅拷贝
程序员文章站
2022-03-10 13:04:48
深拷贝与浅拷贝 总结: # 浅拷贝:list dict: 嵌套的可变数据类型是同一个 # 深拷贝:list dict: 嵌套的不可变数据类型彼此独立 浅拷贝 # 个人理解: # 在内存中重新创建一个空间(所以内存地址不同), # 内存地址延用之前的,所以列表内每个元素的内存地址相同, # 修改数据: ......
深拷贝与浅拷贝
总结:
# 浅拷贝:list dict: 嵌套的可变数据类型是同一个 # 深拷贝:list dict: 嵌套的不可变数据类型彼此独立
浅拷贝
# 个人理解: # 在内存中重新创建一个空间(所以内存地址不同), # 内存地址延用之前的,所以列表内每个元素的内存地址相同, # 修改数据:如列表内元素为不可变类型,修改后,相当于修改了内存地址指向,拷贝的用的是之前的内存地址,所以两个列表同一位置,数据不同 # 如列表内元素为可变类型,两个列表id相同,修改后,id依然不变,所以,列表内可变类型元素修改后,两个同时修改 # 拷贝后,两者id不同 list1 = [1, 201, "name", ["zhangsan", "lisi"]] list2 = list1.copy() print(id(list1)) # 1494875032904 print(id(list2)) # 1494875033032 # 拷贝后,直接给列表增加数据 # copy之后,内存地址不一样,此时再去修改数据,只是修改的自己本身,不影响copy后的数据 list1.append("333") print(list1) # [1, 201, 'name', ['zhangsan', 'lisi'], '333'] print(list2) # [1, 201, 'name', ['zhangsan', 'lisi']] # copy后,修改列表内不可变数据类型数据,修改后,不影响copy数据 list1[0] = 800 print(id(list1[0])) # 2742476311120 print(id(list2[0])) # 1894219888 print(list1) # [800, 201, 'name', ['zhangsan', 'lisi'], '333'] print(list2) # [1, 201, 'name', ['zhangsan', 'lisi']] # copy后,修改列表内可变数据类型数据,修改后,两者同时改变 list1[-2].append("huhansan") print(id(list1[-2])) # 324363528840 print(list1) # [1, 201, 'name', ['zhangsan', 'lisi', 'huhansan'], '333'] print(id(list2[-1])) # 324363528840 print(list2) # [1, 201, 'name', ['zhangsan', 'lisi', 'huhansan']]
深拷贝
# 深拷贝 copy后,两者彼此完全独立 # python优化为:列表中不可变数据类型使用同一地址,可变数据类型重新创建,彼此独立 import copy list1 = [1, 201, "name", ["zhangsan", "lisi"]] list2 = copy.deepcopy(list1) print(id(list1)) # 2336950587016 print(id(list2)) # 2336950570440 # 修改深拷贝后,列表内可变数据类型数据,两者id不同,彼此独立 list1[-1].append("wangwu") print(id(list1[-1])) # 1506007387720 print(id(list2[-1])) # 1506007384904 print(list1) # [1, 201, 'name', ['zhangsan', 'lisi', 'wangwu']] print(list2) # [1, 201, 'name', ['zhangsan', 'lisi']] # 面试题: list3 = [1, 2, 3, [22, 33]] list4 = list3[:] list3[-1].append("zhangsan") print(id(list3[-1])) # 1966908952200 print(id(list4[-1])) # 1966908952200 print(list3) # [1, 2, 3, [22, 33, 'zhangsan']] print(list4) # [1, 2, 3, [22, 33, 'zhangsan']]