深拷贝与浅拷贝
总结:
- # 浅拷贝: 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']]
来源: https://www.cnblogs.com/index-01/p/12676398.html