python中深浅拷贝学习

0. 写作目的

好记性不如烂笔头。

1. python 中的深度拷贝

1.1 常数的拷贝

对于常数的拷贝,类似于数值的地址是一定,当进行赋值时,先共用一个内存,如果一方修改了内容,则该方的地址改变,从而使得两个变量不再相同,即一方修改另一方不会修改。

a = 2
b = a
print( "a = {}, b = {}".format(a, b) ) 
## result
## a = 2, b = 2

print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )
## result
## id(a) = 1427401776, id(b) = 1427401776

a = 3
print( "a = {}, b = {}".format(a, b) ) 
## result
## a = 3, b = 2

print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )
## result
## id(a) = 1427401808, id(b) = 1427401776

1.2 list 和 array(numpy)的copy

如果直接赋值拷贝,进行的是浅拷贝。

python2中需要使用b = copy.copy(a)才能赋值,如果是python3则直接使用b  = a.copy()即可赋值。

如果使用copy()使用,需要看是数据的类型才能决定是深拷贝还是浅拷贝。

如果是单个list,如a = [1, 2, 3],使用 b = a.copy() 或者 b = copy.copy(a)进行的可以理解为深拷贝,因此改变b中的值,a的值不会改变。但是如果是复杂的list,如a  = [ [1, 2], [3, 4] ],如果使用b = a.copy() 或者 b = copy.copy( a )进行的是浅拷贝,如果需要进行深拷贝需要,b = copy.deepcopy( a )。

总结:如果想使用深拷贝,建议直接使用b = copy.deepcopy( a ),以免出现不必要的错误。

import numpy as np

a = [1, 2, 3]
b = a
print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )
## result
## id(a) = 57435528, id(b) = 57435528



b[0] = 10
print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )
## result
## id(a) = 57435528, id(b) = 57435528

b = a.copy()
print( "id(a) = {}, id(b) = {}".format(id(a), id(b)) )

## result
## id(a) = 57435528, id(b) = 57435656

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值