python之深浅copy

隐身守侯 提交于 2020-01-11 06:52:36

一.is 与 ==

python中 == 是比较二者值是否相同,is用来比较二者的内存地址是否相同.

n1 = -55
n2 = -55
print(n1 == n2)  # True
print(id(n1), id(n2))  # 1976371124624 1976371124656
n3 = 'ddd' 
n4 = 'ddd'
print(id(n3), id(n4))  # 2543122508856 2543122508856
print(n3 is n4)  # True

二.赋值

2.1 小数据池

 两个变量分别进行数值赋值操作是,如(n1 = 'goulonghui', n2 = 'goulonghui),存在小数据池概念

       小数据池: int,str在一定范围内,如果两个数值相同,为了节省内存,共用一个内存地址

  int范围: -5 - 256

  

       字符串:①单个字母*int(20)存在小数据池,包括20

   

   

      ②全是字母或者数字,或者字母和数字的任意组合都存在小数据池,  其他都没有

    

  

2.2 变量之间相互赋值

  python中两个变量之间的相互赋值,则二者共用同一块内存,内存地址相同.(两基友共用一个充气娃娃实例)

n3 = [1, 2, 3, [11, 22]]
n4 = n3
print(n3, id(n3))  # [1, 2, 3, [11, 22]] 2195629156744
print(n4, id(n4))  # [1, 2, 3, [11, 22]] 2195629156744

print(id(n3[-1]))  # 2195630020424
print(id(n4[-1]))  # 2195630020424

 三. 浅拷贝

python中利用copy()命令去进行copy即为浅拷贝.

对于浅拷贝来说,第一层创建的是最新的内存地址,而从第二层开始都指向同一个内存地址,所以对于第二层及更深的层数来说,保持一致性.

l1 = [1, 2, 3, 4, [11, 22, 33]]
l2 = l1.copy()
# print(l1, id(l1))  # [1, 2, 3, 4, [11, 22, 33]] 2679464274312
# print(l2, id(l2))  # [1, 2, 3, 4, [11, 22, 33]] 2679465137864
# print(l1[-1], id(l1[-1]))  # [11, 22, 33] 1436905199432
# print(l2[-1], id(l2[-1]))  # [11, 22, 33] 1436905199432
# 例如:
# l1.append(5)
# print(l1)  # [1, 2, 3, 4, [11, 22, 33], 5]
# print(l2)  # [1, 2, 3, 4, [11, 22, 33]]  因为二者内存地址不相同
l1[4].append(66)
print(l1)  # [1, 2, 3, 4, [11, 22, 33, 66]]
print(l2)  # [1, 2, 3, 4, [11, 22, 33, 66]] 因为二者内存地址相同

注意:切片属于浅拷贝

# 切片属于浅拷贝
li = [1, 2, 3, 4, [11, 22, 33]]
li1 = li[:]
print(li, id(li))  # [1, 2, 3, 4, [11, 22, 33]] 2523075651976
print(li1, id(li1))  # [1, 2, 3, 4, [11, 22, 33]] 2523076515528 内存地址不同
print(li[-1], id(li[-1]))  # [11, 22, 33] 2523076515656
print(li1[-1], id(li1[-1]))  # [11, 22, 33] 2523076515656  内存地址相同

四.深拷贝

python中利用copy模块下的deepcopy()来进行深拷贝

深拷贝中每一层均是完全独立的.

# 深拷贝
from copy import deepcopy
li = [1, 2, 3, ['gou long hui', 'lao gu an tou']]
li1 = deepcopy(li)
# print(li, id(li))  # [1, 2, 3, ['gou long hui', 'lao gu an tou']] 2009288054664
# print(li1, id(li1))  # [1, 2, 3, ['gou long hui', 'lao gu an tou']] 2009288055944  内存地址不相同
# print(li[3], id(li[3]))  # ['gou long hui', 'lao gu an tou'] 1702936217288
# print(li1[3], id(li1[3]))  # ['gou long hui', 'lao gu an tou'] 1702936218696   内存地址不相同
# 例
# li.append(4)
# print(li)  # [1, 2, 3, ['gou long hui', 'lao gu an tou'], 4]
# print(li1)  # [1, 2, 3, ['gou long hui', 'lao gu an tou']]
li[3].append('ni hao a')
print(li)  # [1, 2, 3, ['gou long hui', 'lao gu an tou', 'ni hao a']]
print(li1)  # [1, 2, 3, ['gou long hui', 'lao gu an tou']]

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!