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']]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值