黑马程序员技术交流社区

标题: python中的深拷贝与浅拷贝,妈妈再也不用担心我犯迷糊了 [打印本页]

作者: dingliu    时间: 2018-6-21 10:47
标题: python中的深拷贝与浅拷贝,妈妈再也不用担心我犯迷糊了
深拷贝与浅拷贝历来就是让人懵懵哒的知识点,让小编带你答疑解惑
在拷贝不同的数据类型时,深拷贝与浅拷贝的规律也是不相同的
一、拷贝字符串、数字,一维元祖等不可变的数据类型时,深拷贝与浅拷贝都是引用指向
[Python] 纯文本查看 复制代码
>>> import copy

>>> a = 100

>>> b = copy.copy(a)

>>> c = copy.deepcopy(a)

>>> a

100

>>> b

100

>>> c

100

>>> id(a)

1640280256

>>> id(b)

1640280256

>>> id(c)

1640280256

二、当拷贝一维列表、字典等可变数据类型,即列表和字典中不嵌套列表和字典,
深拷贝和浅拷贝都会开辟内存空间并将数据复制一份保存下来,
当被拷贝的对象发生变化时,不影响深拷贝与浅拷贝的对象
[Python] 纯文本查看 复制代码
>>> a = [100, 200]

>>> b = copy.copy(a)

>>> c = copy.deepcopy(a)

>>> id(a)

2485240829768

>>> id(b)

2485240849928

>>> id(c)

2485240862728

>>> a.append(300)

>>> a

[100, 200, 300]

>>> b

[100, 200]

>>> c

[100, 200]

三、多维数据类型,外层为元祖,内层为列表、字典时,
浅拷贝是外层和内层都是引用指向,
深拷贝会开辟内存空间,并将数据拷贝一份保存,
当被拷贝的数据发生变化时,会影响浅拷贝的数据,但是不会影响深拷贝的数据
[Python] 纯文本查看 复制代码
>>> a = [100,200]

>>> b = [300,400]

>>> c = (a,b)

>>> d = copy.copy(c)

>>> e = copy.deepcopy(c)

>>> c

([100, 200], [300, 400])

>>> d

([100, 200], [300, 400])

>>> e

([100, 200], [300, 400])

>>> id(c)

2485240664456

>>> id(d)

2485240664456

>>> id(e)

2485240583944

>>> id(c[0])

2485240905928

>>> id(d[0])

2485240905928

>>> id(e[0])

2485240956232

>>> c[0].append(1000)

>>> c

([100, 200, 1000], [300, 400])

>>> d

([100, 200, 1000], [300, 400])

>>> e

([100, 200], [300, 400])
四、多维数据类型,外层为列表,内层为列表、字典时,
浅拷贝会开辟内存空间,但是存储的是内层数据的引用指向,
深拷贝会开辟内存空间,并将数据拷贝一份保存,
当被拷贝的数据发生变化时,会影响浅拷贝的数据,但是不会影响深拷贝的数据
[Python] 纯文本查看 复制代码
>>> a = [100,200]

>>> b = [300,400]

>>> c = [a,b]

>>> d = copy.copy(c)

>>> e = copy.deepcopy(c)

>>> c

[[100, 200], [300, 400]]

>>> d

[[100, 200], [300, 400]]

>>> e

[[100, 200], [300, 400]]

>>> id(c)

2485240795784

>>> id(d)

2485240808520

>>> id(e)

2485240760712

>>> id(c[0])

2485240784328

>>> id(d[0])

2485240784328

>>> id(e[0])

2485240759176

>>> c

[[100, 200, 1000], [300, 400]]

>>> d

[[100, 200, 1000], [300, 400]]

>>> e

[[100, 200], [300, 400]]






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2