其他分享
首页 > 其他分享> > 四、数据类型 9.可变类型的深浅拷贝

四、数据类型 9.可变类型的深浅拷贝

作者:互联网

深拷贝和浅拷贝

浅拷贝
    引用(地址)拷贝,并没有产生新的内存空间
    如果copy的是对象,原对象和副本对象都指向同一个内存空间,且只copy父对象,不会copy对象内部的子对象

深拷贝
    会产生新的内存空间,原数据和副本数据保持各自独立
    如果copy的是对象,原对象和副本对象指向不同内存空间,且会copy对象及其子对象(产生新的内存空间)

作用
    1.减少内存使用
    2.数据清洗、修改、入库时保留备份

copy

copy.copy(var)
        功能:浅copy

copy.deepcopy(var)
        功能:深copy

可变类型数据深浅copy

可变类型数据深浅copy
    浅copy:copy最外层对象的值,产生新的内存空间,其中的子对象仅被引用,不会被copy
    深copy:copy最外层对象和所有子对象,子对象会产生新的内存空间

import copy

# 可变类型数据的深拷贝与浅拷贝

# 浅拷贝
def copy_test():
    varlist = [1,2,3,['a','b','c']]
    newlist = copy.copy(varlist)
    # 两个list是不同对象
    print(varlist,id(varlist))
    print(newlist,id(newlist))

    # 操作一维元素
    del newlist[0]
    print(newlist)
    print(varlist)

    # 操作多维元素,此时的操作同样作用于原list
    del newlist[2][0]
    print(newlist)
    print(varlist)

    # 发生以上情况的原因是,list中的多维元素是同一个对象,
    # copy()只复制了最外层list,两个list中的多维元素引用了内存中的同一个数据
    print(id(newlist[2]))
    print(id(varlist[3]))
# copy_test()


[1, 2, 3, ['a', 'b', 'c']] 196300264456
[1, 2, 3, ['a', 'b', 'c']] 196459832264
[2, 3, ['a', 'b', 'c']]
[1, 2, 3, ['a', 'b', 'c']]
[2, 3, ['b', 'c']]
[1, 2, 3, ['b', 'c']]
196300263944
196300263944


print('----------------------------------')

# 深拷贝
def deepcopy_test():
    varlist = [1,2,3,['a','b','c']]
    newlist = copy.deepcopy(varlist)
    print(newlist)

    print(id(newlist[3]))
    print(id(varlist[3]))

    del newlist[3][0]
    print(newlist)
    print(varlist)
deepcopy_test()


[1, 2, 3, ['a', 'b', 'c']]
599371649544
599212970504
[1, 2, 3, ['b', 'c']]
[1, 2, 3, ['a', 'b', 'c']]

# 深浅拷贝对比
A = {1:'a'}
B = [2,3,A]
C = (4,5)
D = [B,C]
print('A:',A,id(A))
print('B[2]:',B[2],id(B[2]))
print('D[0][2]:',D[0][2],id(D[0][2]))

print('B:',B,id(B))
print('D[0]:',D[0],id(D[0]))

print('D:',D,id(D))

# 浅拷贝
# E = copy.copy(D)
# print('E:',E,id(E),' E[0]:',E[0],id(E[0]),' E[0][2]:',E[0][2],id(E[0][2]))

# 深拷贝
E = copy.deepcopy(D)
print('E:', E, id(E), ' E[0]:', E[0], id(E[0]),' E[0][2]:',E[0][2],id(E[0][2]))

print('------------------------------------------------')

A[6] = 'b'
B.insert(3,70)
print('A:',A,id(A))
print('B',B,id(B))
print('D:',D,id(D),' D[0]:',id(D[0]),' D[0][2]:',id(D[0][2]))
print('E:',E,id(E),' E[0]:',id(E[0]),' E[0][2]:',id(E[0][2]))


A: {1: 'a'} 663909056088
B[2]: {1: 'a'} 663909056088
D[0][2]: {1: 'a'} 663909056088
B: [2, 3, {1: 'a'}] 663880618504
D[0]: [2, 3, {1: 'a'}] 663880618504
D: [[2, 3, {1: 'a'}], (4, 5)] 663880619016
E: [[2, 3, {1: 'a'}], (4, 5)] 664039138440  E[0]: [2, 3, {1: 'a'}] 664039138376  E[0][2]: {1: 'a'} 663909056328
------------------------------------------------
A: {1: 'a', 6: 'b'} 663909056088
B [2, 3, {1: 'a', 6: 'b'}, 70] 663880618504
D: [[2, 3, {1: 'a', 6: 'b'}, 70], (4, 5)] 663880619016  D[0]: 663880618504  D[0][2]: 663909056088
E: [[2, 3, {1: 'a'}], (4, 5)] 664039138440  E[0]: 664039138376  E[0][2]: 663909056328

标签:varlist,newlist,数据类型,深浅,print,拷贝,copy,id
来源: https://www.cnblogs.com/HyeJeong/p/15686066.html