Python中的深浅拷贝

深拷贝和浅拷贝

一、浅拷贝与深拷贝

1. 浅拷贝 
   拷贝最外层的对象,内部的元素只拷贝了引用(指向是一样的)
    
2. 深拷贝
   外层对象和内部元素都拷贝了一遍(都有一块新空间)
    
3. 解释:
	比如有一个l = [2,4,6,8]这个列表里的每一个元素都有一个自己的一个地址,这个地址就是相当于列表元素的空间,拷贝外层对象就是拷贝这个列表自己的空间而不是元素的空间。
    所以浅拷贝中拷贝最外层的对象就是拷贝了这个列表的空间,内部元素只拷贝了引用是指他们的元素的空间(地址)是没有改变的; 而深拷贝就是最外层的跟元素的空间都拷贝了,都有了自己的新空间。

二、举例

# 1. 引用 : 两个列表的空间是一样的(引用实际上就是给t1取了一个小名。)
t1 = [2,4,6,8,22]
t2 = t1
print(id(t1),id(t2))  # 35800776 35800776

# 2. 浅拷贝 :两个列表的空间不一样,列表中的元素的空间是一样的
t3 = t1[:]
print(id(t3)) # 35800712 t3是另一块空间

t4 = t1.copy()

# 3. 深拷贝:两个列表的空间不一样,列表中的元素的空间也不一样
from copy import *

t5 = deepcopy(t1)

三、深浅拷贝的补充

1、浅拷贝
a = [1, 23, 4,[10,20]]
b = a.copy()
print(id(a), id(b))  # 2139704714632   2139704716168(外层空间不一样)
print(id(a[0]), id(b[0]))  # 1774742560   1774742560(内部元素地址一样)

# 当你修改了a或b列表里面的int类型的值时,a列表里的也会改变,是因为a[0]还是指向1的地址,b[0]指向了2的地址
b[0] = 2
print(a,b)  # [1, 23, 4, [10, 20]]   [2, 23, 4, [10, 20]]
print(id(a[0]), id(b[0]))  # 1774742560   1774742592
# 当你修改了a或b列表里面的list类型的值时,a,b都发生了改变,是因为a[3][0]之前指向10的地址,现在指向100的地址,而正因为这样b[3][0]之前指向10的地址也发生了改变指向了100的地址。
a[3][0] = 100
print(a,b)  # [1, 23, 4, [100, 20]]   [2, 23, 4, [100, 20]]
2、深拷贝
import copy
a = [1,23,4,5,6,9,[10,20]]
b = copy.deepcopy(a)
print(id(a),id(b))  # 1936202171464   1936202172744 (外层空间地址也改变)
print(id(a[0]),id(b[0]))  # 1774742560   1774742560 (地址没有发生改变是因为Python中的内存优化,															0-256整数都指向一个空间)
a[0] = 22
print(a,b)  # [22, 23, 4, 5, 6, 9, [10, 20]]    [1, 23, 4, 5, 6, 9, [10, 20]]
a[6][0] = 100
print(a,b) # [22, 23, 4, 5, 6, 9, [100, 20]]   [1, 23, 4, 5, 6, 9, [10, 20]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值