深入浅析Python中list的复制及深拷贝与浅拷贝

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

深⼊浅析Python中list的复制及深拷贝与浅拷贝
在Python中,经常要对⼀个list进⾏复制。

对于复制,⾃然的就有深拷贝与浅拷贝问题。

深拷贝与浅拷贝的区别在于,当从原本的list复制出新的list之后,修改其中的任意⼀个是否会对另⼀个造成影响,即这两个list在内存中是否储存在同⼀个区域,这也是区分深拷贝与浅拷贝的重要依据。

接下来我们就针对Python中list复制的⼏种⽅法,来探究⼀下其是属于深拷贝还是浅拷贝。

弄清楚这个问题,有助于我们在编程中规避错误,减少不必要的调试时间。

⼀、⾮拷贝⽅法——直接赋值
如果⽤=直接赋值,是⾮拷贝⽅法。

这两个列表是等价的,修改其中任何⼀个列表都会影响到另⼀个列表。

这也是Python作为动态语⾔与C这类静态语⾔在思想上的不同之处。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
old = [1, [1, 2, 3], 3]
new = old
print('Before:')
print(old)
print(new)
new[0] = 3
new[1][0] = 3
print('After:')
print(old)
print(new)
运⾏结果:
⼆、浅拷贝的⼏种⽅法
1.copy()⽅法
我们来看以下代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
old = [1, [1, 2, 3], 3]
new = old.copy()
print('Before:')
print(old)
print(new)
new[0] = 3
new[1][0] = 3
print('After:')
print(old)
print(new)
运⾏结果:
对于list的第⼀层,是实现了深拷贝,但对于嵌套的list,仍然是浅拷贝。

这其实很好理解,内层的list保存的是地址,复制过去的时候是把地址复制过去了。

嵌套的list在内存中指向的还是同⼀个。

2.使⽤列表⽣成式
使⽤列表⽣成式产⽣新列表也是⼀个浅拷贝⽅法,只对第⼀层实现深拷贝。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
old = [1, [1, 2, 3], 3]
new = [i for i in old]
print('Before:')
print(old)
print(new)
new[0] = 3
new[1][0] = 3
print('After:')
print(old)
print(new)
运⾏结果:
3.⽤for循环遍历
通过for循环遍历,将元素⼀个个添加到新列表中。

这也是⼀个浅拷贝⽅法,只对第⼀层实现深拷贝。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
old = [1, [1, 2, 3], 3]
new = []
for i in range(len(old)):
new.append(old[i])
print('Before:')
print(old)
print(new)
new[0] = 3
new[1][0] = 3
print('After:')
print(old)
print(new)
运⾏结果:
4.使⽤切⽚
通过使⽤[:]切⽚,可以浅拷贝整个列表。

同样的,只对第⼀层实现深拷贝。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
old = [1, [1, 2, 3], 3]
new = old[:]
print('Before:')
print(old)
print(new)
new[0] = 3
new[1][0] = 3
print('After:')
print(old)
print(new)
运⾏结果:
三、深拷贝的实现
如果⽤deepcopy()⽅法,则⽆论多少层,⽆论怎样的形式,得到的新列表都是和原来⽆关的,这是最安全最清爽最有效的⽅法。

使⽤时,要导⼊copy。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import copy
old = [1, [1, 2, 3], 3]
new = copy.deepcopy(old)
print('Before:')
print(old)
print(new)
new[0] = 3
new[1][0] = 3
print('After:')
print(old)
print(new)
运⾏结果:
总结
以上所述是⼩编给⼤家介绍的Python中list的复制及深拷贝与浅拷贝探究,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。

在此也⾮常感谢⼤家对⽹站的⽀持!。

相关文档
最新文档