python深拷贝与浅拷贝

Posted Smart1san

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python深拷贝与浅拷贝相关的知识,希望对你有一定的参考价值。

一、定义

浅拷贝:创建一个新对象,它包含的是对原始对象中所包含想的引用。(若引用的方式修改其中一个对象,另外一个也会跟着改变)

深拷贝:创建一个新对象,并递归的赋值它所包含的对象。(修改其中一个,另外一个是不会跟着变化的)

二、应用

浅拷贝:1.完全切片方法

    2.工厂函数,如 list()

    3. copy 模块中的 copy() 函数

深拷贝:1. copy 模块下的 deep.deepcopy() 函数

三、实例

1.浅拷贝

 1 import copy
 2 
 3 list1 = [1, 2, 3, [a, b, c]]
 4 list2=list1.copy()
 5 # print(id(list1))  # 1710452450504
 6 # print(id(list2))  # 1710452451784
 7 # 说明list2是在内存中独立出一个新的空间
 8 
 9 print(list2)  # [1, 2, 3, [‘a‘, ‘b‘, ‘c‘]]
10 # list1[0]=‘a‘  # 修改了list1最外层(第一层)的值
11 # print(list1)  # [‘a‘, 2, 3, [‘a‘, ‘b‘, ‘c‘]]
12 # print(list2)  # [1, 2, 3, [‘a‘, ‘b‘, ‘c‘]]
13 # # list2第一层的信息并不受到list1的影响
14 # # 并不表示内层的信息也全部复制了。
15 
16 # list2[0]=‘a‘ # 修改list2最外层(第一层)的值
17 # print(list1) # [1, 2, 3, [‘a‘, ‘b‘, ‘c‘]]
18 # print(list2) # [‘a‘, 2, 3, [‘a‘, ‘b‘, ‘c‘]]
19 # # 证实了list2和list1的第一层信息之间是没有相互影响的
20 # # 这一步也不能证实内存的信息是否是深度复制
21 
22 # list1[3][0]=1 # 修改list1内层的值
23 # print(list1)  # [1, 2, 3, [1, ‘b‘, ‘c‘]]
24 # print(list2)  # [1, 2, 3, [1, ‘b‘, ‘c‘]]
25 # # list1内层的值改变,list2内层的值也跟着改变
26 # # list1和list2之间可能还存在着某种联系
27 
28 # list2[3][0]=1 # 修改了list2内层的值
29 # print(list1)  # [1, 2, 3, [1, ‘b‘, ‘c‘]]
30 # print(list2)  # [1, 2, 3, [1, ‘b‘, ‘c‘]]
31 # # 证实list1和list2之间还是有互相影响的
32 # # 应该是list2的内层数据信息的内存地址是指向list1的内层数据信息的地址

2.深拷贝

 1 import copy
 2 
 3 list1 = [1, 2, 3, [a, b, c]]
 4 list2=copy.deepcopy(list1)
 5 # 修改最外层的值其结果与浅拷贝是一致的
 6 
 7 # list1[3][0]=1
 8 # print(list1) # [1, 2, 3, [1, ‘b‘, ‘c‘]]
 9 # print(list2) # [1, 2, 3, [‘a‘, ‘b‘, ‘c‘]]
10 # # list1和list2是没有相互影响的
11 
12 # list2[3][0]=1
13 # print(list1) # [1, 2, 3, [‘a‘, ‘b‘, ‘c‘]]
14 # print(list2) # [1, 2, 3, [1, ‘b‘, ‘c‘]]
15 # # list2和list1是没有相互影响的
16 
17 # 证实了深拷贝是递归的复制所有数据信息的

 

以上是关于python深拷贝与浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

Python中list的复制及深拷贝与浅拷贝探究

python的深拷贝与浅拷贝

python中的深拷贝与浅拷贝

[Python3 填坑] 009 深拷贝与浅拷贝

python深拷贝与浅拷贝

python:深拷贝与浅拷贝