Python的深浅拷贝

目录

一、可变对象和不可变对象

二、概念

三、深浅拷贝

1.浅拷贝

2.深拷贝


一、可变对象和不可变对象

可变类型:列表、字典、集合

不可变类型:整数、小数、复数、字符串、元组

二、概念

= 是指向引用

浅拷贝:只拷贝父对象,不拷贝子对象

深拷贝:拷贝对象以及其子对象

三、深浅拷贝

copy是python的标准库

import copy

copy.copy()  浅拷贝

copy.deepcopy() 深拷贝

1.浅拷贝

import copy
a = [1,2,3,4,['a', 'b'],('e','f')]
b = copy.copy(a)
print("id(a[4]),id(b[4]) :",id(a[4]),id(b[4]))
a.append(6)
b.append(7)
print("id(a[4]),id(b[4]) :",id(a[4]),id(b[4]))
print("a,b :",a,b)
print("id(a),id(b):",id(a),id(b))
b[4].append('c')
print("a,b :",a,b)
print("id(a),id(b):",id(a),id(b))

第一次打印 时,a列表和b列表里面的地址值是一样的

列表新增内容之后,浅拷贝第二次打印地址不会改变a,b列表的地址值;

第三次打印是打印a,b列表里面子列表元素的地址值;

然后b列表的子列表新增一个元素,第四次是打印一下a,b列表,可以发现两个列表的子列表都同时新增了新的元素;

第五次打印可以看到a,b列表的父对象地址值都没有发生变化;

第六次打印可以看到a,b列表的子列表的地址值是一样的,没有改变;

说以说明浅拷贝只拷贝的父对象的地址值,不会改变子对象的地址值;

2.深拷贝

深拷贝使用的是copy.deepcopy()

import copy
a = [1,2,3,['a','b']]
b = copy.deepcopy(a)

print("id(a), id(b):",id(a), id(b))
print("id(a[3]), id(b[3]):",id(a[3]), id(b[3]))
a[3].append('C')
b[3].append('d')
print(a,b)
print("id(a), id(b):",id(a), id(b))
print("id(a[3]), id(b[3]):",id(a[3]), id(b[3]))

第一次打印的是a,b列表的地址值,深拷贝情况两个列表的地址值是独立的不一样的

第二次打印的是a,b列表的子列表的地址值,深拷贝情况下子列表的地址值也是独立的不一样的;

给两个子列表新增元素后,

第三次打印的是a,b列表的地址值,保持不变;

第四次打印的是a,b列表的子列表的地址值,新增之后保持不变;

所以深拷贝时,拷贝的父对象以及其子对象的地址值都是重新生成的独立的,互不影响的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值