python的浅拷贝与深拷贝有什么区别
本文以python的数据拷贝为例,为大家分析浅拷贝与深拷贝的区别,阅读完整文相信大家对python的浅拷贝与深拷贝有了一定的认识。
一.普通的变量赋值我们平常使用的变量赋值就是浅拷贝,即两个变量共享同一个内存块,相同的内存地址,一旦值发生改变,另外一个变量的值也会跟随着一起变化,演示代码如下:
1
2
3
4
5
6
7
8
9
10
list1 = [1,2,3,4,5]
# 普遍的变量赋值
list2 = list1
print(id(list1))
print(id(list2))
# 修改列表list2的数据
list2.append(123)
print(list1)
print(list2)
输出结果:
1
2
3
4
2251297055368
2251297055368
[1, 2, 3, 4, 5, 123]
[1, 2, 3, 4, 5, 123]
注意:常规的变量赋值共享一个内存块,内存地址相同,一旦值发生改变,共享同一个内存地址的所有变量值都会发生改变,可以直接通过内置函数id()对比下内存地址即可!
二.浅拷贝和深拷贝在python开发过程中,有些时候对于上面的情况并不是我们想要的,我们更加希望对赋值后的变量做修改并不影响原始变量的值,如何实现呢?这里就需要介绍一下copy模块:
copy.copy()– 浅拷贝,重新分配内存,只拷贝父对象,不会拷贝对象的内部的子对象;
copy.deepcopy()– 深拷贝,重新分配内存,拷贝对象及其所有子对象;
1.浅拷贝copy()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:何以解忧
@Blog(个人博客地址): shuopython.com
@WeChat Official Account(微信公众号):猿说python
@Github:www.github.com
@File:python_copy.py
@Time:2019/10/27:25
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
"""
import copy
spam = ['A', 'B', 'C', 'D']
# 使用浅拷贝
cheese = copy.copy(spam)
cheese[1] = 42
print(id(spam),spam)
print(id(cheese),cheese)
输出结果:
1
2
57205555 ['A', 'B', 'C', 'D']
57208888 ['A', 42, 'C', 'D']
2.深拷贝deepcopy()1
2
3
4
5
6
7
import copy
spam = ['A', 'B', 'C', 'D']
# 使用深拷贝
cheese = copy.deepcopy(spam)
cheese[1] = 42
print(id(spam),spam)
print(id(cheese),cheese)
输出结果:
1
2
57205555 ['A', 'B', 'C', 'D']
57208888 ['A', 42, 'C', 'D']
3.浅拷贝和深拷贝区别对于常规的字典或者列表使用copy模块的深拷贝或者浅拷贝,两者并没有区别!如果字典或者列表中还有包含有子类的话,使用copy模块的深拷贝和浅拷贝的话,结果就大不相同了:
copy.copy()— 重新分配内存,只拷贝父对象,不会拷贝对象内部的子对象;
copy.deepcopy()— 重新分配内存,拷贝对象及其所有子对象;
示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import copy
print("使用浅拷贝:")
spam = [['A','E'], 'B', 'C', 'D']
# 使用浅拷贝
cheese = copy.copy(spam)
cheese[0][0] = 42
print(id(spam),spam)
print(id(cheese),cheese)
print("***"*20)
print("使用深拷贝:")
spam = [['A','E'], 'B', 'C', 'D']
# 使用深拷贝
cheese = copy.deepcopy(spam)
cheese[0][0] = 42
print(id(spam),spam)
print(id(cheese),cheese)
输出结果:
1
2
3
4
5
6
7
使用浅拷贝:
2179653046408 [[42, 'E'], 'B', 'C', 'D']
2179653046920 [[42, 'E'], 'B', 'C', 'D']
************************************************************
使用深拷贝:
2179653086728 [['A', 'E'], 'B', 'C', 'D']
2179653046408 [[42, 'E'], 'B', 'C', 'D']
以上就是python的浅拷贝与深拷贝的区别,看完之后是否有所收获呢?如果想了解更多相关内容,欢迎关注亿速云行业资讯!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。