Python-拷贝

深拷贝、浅拷贝

1、浅拷贝

浅拷贝是对一个对象的最外层拷贝并重新分配地址空间,而内层对象还是原地址空间,保持不变。所以原对象内层对象变化,则拷贝后的对象内层也会发生变化。

例如:

import copy
a = [[1, 2], [3, 4]]
b = copy.copy(a)
print("a's id is:", id(a))
print("a[0]'s id is:", id(a[0]))
print("a[1]'s id is:", id(a[1]))

print("b's id is:", id(b))
print("b[0]'s id is:", id(b[0]))
print("b[1]'s id is:", id(b[1]))

输出:

a's id is: 140533609027272
a[0]'s id is: 140533608894984
a[1]'s id is: 140533609215816


b's id is: 140533612480712
b[0]'s id is: 140533608894984
b[1]'s id is: 140533609215816

2、深拷贝

深拷贝是对一个对象的所有层进行拷贝重新分配地址空间,相当于2个不同对象,只是对象的值相同而地址空间不同。

import copy
a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)
print("a's id is:", id(a))
print("a[0]'s id is:", id(a[0]))
print("a[1]'s id is:", id(a[1]))

print("\n")

print("b's id is:", id(b))
print("b[0]'s id is:", id(b[0]))
print("b[1]'s id is:", id(b[1]))
print("\n")

输出:

a's id is: 140507304421064
a[0]'s id is: 140507304288776
a[1]'s id is: 140507304609608


b's id is: 140507307886856
b[0]'s id is: 140507304421448
b[1]'s id is: 140507307886664

3、分片表达式

import copy
a = [[1, 2], [3, 4]]
b = a[:]
print("a's id is:", id(a))
print("a[0]'s id is:", id(a[0]))
print("a[1]'s id is:", id(a[1]))

print("\n")

print("b's id is:", id(b))
print("b[0]'s id is:", id(b[0]))
print("b[1]'s id is:", id(b[1]))
print("\n")

与copy.copy()一样属于浅拷贝
输出

a's id is: 140390722840264
a[0]'s id is: 140390722707976
a[1]'s id is: 140390723028808


b's id is: 140390726306056
b[0]'s id is: 140390722707976
b[1]'s id is: 140390723028808

4、字典的copy方法

d = {"name": "cj", "age": 18, "ball": [1, 3]}
e = d.copy()
print("d's id is:", id(d))
print("e's id is:", id(e))
print("\n")
print("d['ball']s id is:", id(d['ball']))
print("e['ball']'s id is:", id(e['ball']))

d['ball'].append(4)
print("d['ball']s id is:", d['ball'])
print("e['ball']'s id is:", e['ball'])

输出

d's id is: 140619243378296
e's id is: 140619243378368


d['ball']s id is: 140619028580552
e['ball']'s id is: 140619028580552
d['ball']s id is: [1, 3, 4]
e['ball']'s id is: [1, 3, 4]

TIPS:

1、copy.copy 对于不可变类型,不会拷贝只会指向该对象的地址空间,相当于赋值,深拷贝一样
2、copy.copy 对于可变类型,会进行浅拷贝,深拷贝还是会递归拷贝

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值