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]
‘’’
##深拷贝中将内嵌的列表也拷贝了一个地址。所以不受影响
#深拷贝也叫递归拷贝