欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python基础-深浅拷贝

程序员文章站 2022-06-22 08:10:10
深拷贝与浅拷贝 总结: # 浅拷贝:list dict: 嵌套的可变数据类型是同一个 # 深拷贝:list dict: 嵌套的不可变数据类型彼此独立 浅拷贝 # 个人理解: # 在内存中重新创建一个空间(所以内存地址不同), # 内存地址延用之前的,所以列表内每个元素的内存地址相同, # 修改数据: ......

深拷贝与浅拷贝

总结:

# 浅拷贝:list dict: 嵌套的可变数据类型是同一个
# 深拷贝:list dict: 嵌套的不可变数据类型彼此独立

浅拷贝python基础-深浅拷贝

# 个人理解:
# 在内存中重新创建一个空间(所以内存地址不同),
# 内存地址延用之前的,所以列表内每个元素的内存地址相同,
# 修改数据:如列表内元素为不可变类型,修改后,相当于修改了内存地址指向,拷贝的用的是之前的内存地址,所以两个列表同一位置,数据不同
#         如列表内元素为可变类型,两个列表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']]