python基础-深浅拷贝

深拷贝与浅拷贝

总结:python

# 浅拷贝: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']]
相关文章
相关标签/搜索