python中深浅拷贝

先弄懂下面概念

变量 --引用--对象--(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝)

变量是一个系统表的元素,拥有指向对象的链接的空间

对象是被分配的一块内存,存储其所代表的值

引用是自动形成的从变量到对象的指针

在python中不可变对象知:一旦创建就不可修改对象,包括字符创,元组,数字

在python中可变对象是指:可以修改的对象,包括:列表,字典

1.不可变对象的赋值

a的值发生改变,b不会跟着改变

a = 1
b = a
print(a)
print(b)
a  = 3
print(a)
print(b)

结果:
1
1
3
1

2.可变对象的赋值

a发生改变,b也跟着改变

a = [1,2]
b = a
print(a)
print(b)
a[0] = 3
print(a)
print(b)


结果:
[1, 2]
[1, 2]
[3, 2]
[3, 2]

要想b的值不会改变,就要用到copy模块

3.深浅拷贝

浅拷贝:只拷贝顶级的对象,或者说:父级对象

深拷贝:拷贝所有对象,顶级对象以及嵌套对象。或者说:父级对象以及子对象

import copy

#第二种,字典中有嵌套
d = {'name':{'first':'zhang','last':'derek'},
    'job':['IT','HR']}
c1 = copy.copy(d)
c2 = copy.deepcopy(d)
print(id(d),id(c1),id(c2))    #31157416 31940256 35946856

d['job'][0] = 'tester'
print(d,c1,c2)
# {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['tester', 'HR']}
# {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['tester', 'HR']}
# {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['IT', 'HR']}

源对象修改值的时候,浅拷贝的值跟着改变,深拷贝的值没变
import copy

#第二种,字典中有嵌套
d = {'name':{'first':'zhang','last':'derek'},
    'job':['IT','HR']}
c1 = copy.copy(d)
c2 = copy.deepcopy(d)
print(id(d),id(c1),id(c2))    #31157416 31940256 35946856

d['job'][0] = 'tester'
print(d,c1,c2)
# {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['tester', 'HR']}
# {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['tester', 'HR']}
# {'name': {'first': 'zhang', 'last': 'derek'}, 'job': ['IT', 'HR']}

源对象修改值的时候,浅拷贝的值跟着改变,深拷贝的值没变

结论:

  • 深浅拷贝都是对源对象的复制,占用不同的内存空间
  • 如果源对象只有一级目录的话,源做任何改动,都不会影响深浅拷贝对象
  • 如果源对象不止一级目录的话,源做任何改动。都要影响浅拷贝,但不影响深拷贝
  • 序列对象的切片其实是浅拷贝,即只拷贝顶级对象

猜你喜欢

转载自www.cnblogs.com/xuyxbiubiu/p/10397487.html
今日推荐