Python基础——深拷贝、浅拷贝

1.前言

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。

2.变量的地址(id)

什么是id?一个对象的id值在CPython解释器里就代表它在内存中的`地址

import copy

a = [11,22,33,44]
b = a

print(id(a))
print(id(b))
print(id(a) == id(b))

b[1] = 8888
print(a,b)

#输出
4558214960
4558214960
True
[11, 8888, 33, 44] [11, 8888, 33, 44]

3.浅拷贝(copy.copy)

当使用浅拷贝时,python只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。看代码:

import copy

a = [11,22,33,44]
c = copy.copy(a)

print(id(a))
print(id(c))
print(id(a) == id(c))

print('\n')
c[1] = 8888
print(a)
print(c)
print(id(a))
print(id(c))
print(id(a) == id(c))

#输出
4559192784
4559193024
False


[11, 22, 33, 44]
[11, 8888, 33, 44]
4559192784
4559193024
False

4.深拷贝(copy.deepcopy)

deepcopy对外围和内部元素都进行了拷贝对象本身,而不是对象的引用。

import copy

a = [[11,22],[33,44]]
d = copy.copy(a)

print(id(a))
print(id(d))
print(id(a) == id(d))

a[1][1] = 8888
print(a)
print(d)

print('\n')
e = copy.deepcopy(a)     #因为时深拷贝,这时e中内部元素的值不会因为a中的值改变而改变
a[1][0] = 9999 
print(a)
print(e)
print(id(a))
print(id(e))
print(id(a) == id(e))

#输出
4559792160
4559791920
False
[[11, 22], [33, 8888]]
[[11, 22], [33, 8888]]


[[11, 22], [9999, 8888]]
[[11, 22], [33, 8888]]
4559792160
4556920224
False
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值