2021-07-07

本文详细介绍了Python中的内存存储、浅拷贝和深拷贝概念。Python变量实际上存储的是对象的引用,而非值。对于可变和不可变数据类型,拷贝行为有所不同。浅拷贝仅复制最外层结构,而深拷贝则递归复制所有数据,确保数据独立性。在处理复杂数据结构如列表和字典时,深拷贝能避免原始数据被修改的影响。文章通过实例展示了浅拷贝和深拷贝的区别,并提供了相关API的使用方法。
摘要由CSDN通过智能技术生成

Python:内存存储、浅拷贝、深拷贝:

Python与C不一样,C中变量保存的是变量的值;而Python中变量保存的是变量的地址,变量只是对地址的引用


问题描述:

每一次赋值,都会产生一个新的地址空间,把新内容的地址赋值给变量,但对于相同的值,地址不发生变化

a = 123	  # id(a) = 111111111
a = 456   # id(a) = 6161
b = 111	  # id(b) = 666666
c = 111   # id(c) = 666666
		

数据分类:
1. 可变数据类型:list dict
2. 不可变:int float string tuple

	对复杂的数据类型(列表、元祖、字典),如果添加某一项元素,或者添加几个元素,不会改变
其本身的地址,只会改变其内部元素的地址引用,但是如果对其重新赋值时,就会重新赋予地
址覆盖就地址,这时地址就会发生改变

深拷贝:
1.就是递归所有的数据进行重新创建 。
2. 作用:保证数据的独立性。
3. 缺点:比较占内存

浅拷贝:
1. 最外层的结构复制创建,里面的数据还是引用原先的数据,类似于快捷方式

注意:
1. 不可变类型不管是什么拷贝都是引用
2. 常用的api基本上都是浅拷贝(省内存嘛)

list_ = [1, 2, 3]	# id(list_) = 777777
list_.append(4)		# id(list_) = 777777
del list_[0]		# id(list_) = 777777
list_ = [5, 6, 7]	# id(list_) = 888888

	无论是添加、删除元素,列表对应地址都不变,直到重新赋值
list1 = [1, 2, 3]
list2 = list1
##引用
print(list1 == list2) #==表示数值是否相同	True
print(list1 is list2) #is表示地址是否相同	True
print(‘修改list1’)
list1[0] = 0
print(“展示修改之后的list2”,list2)

##浅拷贝
##浅拷贝中地址不同,数值相同
list2 = list1.copy()
print(list1==list2) #数值依旧相同	True
print(list1 is list2) #地址不同了	False
print(id(list1)) #id 用来查看地址	
print(id(list2))

##深拷贝,需要导包copy。deepcopy
from copy import deepcopy
list2 = deepcopy(list1)
print(list1==list2) #数值依旧相同	True
print(list1 is list2) #地址不同了	False
print(id(list1)) #id 用来查看地址
print(id(list2))
#当需要拷贝的东西只有一层的时候深拷贝与浅拷贝性质相同
#当需要拷贝的文件中嵌套了别的文件,深拷贝不受影响。浅拷贝受影响
#比如列表嵌套列表
list1 = [[11,22,33],12,13]
浅拷贝,浅拷贝受影响

list2 = list1.copy()
list1[0][0] = 0
print(‘修改之后的list1’,list1)
print(‘修改之后的list2’,list2)
‘’’
修改之后的list1 [[0, 22, 33], 12, 13] #其中的12,13两个数为小整数池
修改之后的list2 [[0, 22, 33], 12, 13]

‘’’
深拷贝,不受影响

list2 = deepcopy(list1)
list1[0][0] = 0
print(‘修改之后的list1’,list1)
print(‘修改之后的list2’,list2)

‘’’
修改之后的list1 [[0, 22, 33], 12, 13]
修改之后的list2 [[11, 22, 33], 12, 13]
‘’’
##深拷贝中将内嵌的列表也拷贝了一个地址。所以不受影响
#深拷贝也叫递归拷贝		

转载出处:

转载出处_1
转载出处_2
转载出处_3
转载出处_4
转载出处_5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值