Python基础之赋值,浅拷贝,深拷贝的区别


Posted in Python onApril 30, 2021

一、赋值

不会开辟新的内存空间,只是复制了新对象的引用。所以当一个数据发生变化时,另外一个数据也会随之改变。

二、 浅拷贝

创建新对象,其内容是对原对象的引用。浅拷贝之所以称为浅拷贝,是因为它仅仅只拷贝了第一层,即只拷贝了最外层的对象本身,内部的元素都只是拷贝了一个引用而已,即内部元素如果被修改,则另外一个数据也会发生变化。

浅拷贝的三种形式:

A = [1, 2, 3, 4]
  • 切片操作
# 第1种
B = A[:]
# 第2种
B = [a for a in A]
  • 工厂函数
B = list(A)
  • copy函数
B = copy.copy(A)

浅拷贝要分两种情况进行讨论:

1)当浅拷贝的值是不可变对象(例如字符串、元组、数值类型)时,和赋值情况一样,对象的内存地址(id())与浅拷贝原来的值一致。

2)当浅拷贝的值是可变对象(例如列表、字典、集合等)时,也需要分两种情况讨论:

首先,原来值的内存地址与拷贝后的内存地址不同。

  • 当要拷贝的对象里面,没有可变的子对象时,原来值(拷贝值)的改变并不会影响拷贝值(原来值)。
  • 当要拷贝的对象里面,有可以改变的子对象时,改变该子对象,原来值和拷贝值之间会互相影响。

三、深拷贝

深拷贝拷贝出来的对象是一个全新的对象,和原来的对象没有任何的关联。改变原有对象不会影响新的拷贝对象。

四、例子

  • 不可变对象
import copy
# 不可变对象
# A = (1, 2, 'hello')   # 元组
# A = 1                 # 数值
A = 'hello'             # 字符串

print("********赋值********")
B = A
print(id(A))
print(id(B))
print(A)
print(B)

print("********浅拷贝********")
B = copy.copy(A)
print(id(A))
print(id(B))
print(A)
print(B)

print("********深拷贝********")
B = copy.deepcopy(A)
print(id(A))
print(id(B))
print(A)
print(B)

结果:

********赋值********
1894005658264
1894005658264
hello
hello
********浅拷贝********
1894005658264
1894005658264
hello
hello
********深拷贝********
1894005658264
1894005658264
hello
hello

  • 可变对象
import copy
# 可变对象
A = [1, 2, 3]

print("********赋值********")
B = A
print(id(A))
print(id(B))
print(A)
print(B)

print("********浅拷贝********")
B = copy.copy(A)
print(id(A))
print(id(B))
print(A)
print(B)

print("********深拷贝********")
B = copy.deepcopy(A)
print(id(A))
print(id(B))
print(A)
print(B)

结果:

********赋值********
1602694308360
1602694308360
[1, 2, 3]
[1, 2, 3]
********浅拷贝********
1602694308360
1602694308424
[1, 2, 3]
[1, 2, 3]
********深拷贝********
1602694308360
1602950316296
[1, 2, 3]
[1, 2, 3]

  • 可变对象修改外层
import copy
# 可变对象
A = [1, 2, 3, [11, 10, 20]]

# 可变对象的外层修改
B1 = A                   # 赋值
B2 = copy.copy(A)        # 浅拷贝
B3 = copy.deepcopy(A)    # 深拷贝
A.append(4)
print("********赋值********")

print(id(A))
print(id(B1))
print(A)
print(B1)

print("********浅拷贝********")
print(id(A))
print(id(B2))
print(A)
print(B2)

print("********深拷贝********")
print(id(A))
print(id(B3))
print(A)
print(B3)

结果:

********赋值********
2215309238856
2215309238856
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20], 4]
********浅拷贝********
2215309238856
2215593496776
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]
********深拷贝********
2215309238856
2215593518024
[1, 2, 3, [11, 10, 20], 4]
[1, 2, 3, [11, 10, 20]]

  • 可变对象修改内层
import copy
# 可变对象
A = [1, 2, 3, [11, 10, 20]]

# 可变对象的内层修改
B1 = A                   # 赋值
B2 = copy.copy(A)        # 浅拷贝
B3 = copy.deepcopy(A)    # 深拷贝
A[3].append(4)
print("********赋值********")

print(id(A))
print(id(B1))
print(A)
print(B1)

print("********浅拷贝********")
print(id(A))
print(id(B2))
print(A)
print(B2)

print("********深拷贝********")
print(id(A))
print(id(B3))
print(A)
print(B3)

结果

********赋值********
2288591069768
2288591069768
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********浅拷贝********
2288591069768
2288847138760
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20, 4]]
********深拷贝********
2288591069768
2288847168264
[1, 2, 3, [11, 10, 20, 4]]
[1, 2, 3, [11, 10, 20]]

到此这篇关于Python基础之赋值,浅拷贝,深拷贝的区别的文章就介绍到这了,更多相关Python赋值 浅拷贝 深拷贝的区别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python基础之函数用法实例详解
Sep 10 Python
Python中的lstrip()方法使用简介
May 19 Python
python放大图片和画方格实现算法
Mar 30 Python
matplotlib 输出保存指定尺寸的图片方法
May 24 Python
python使用flask与js进行前后台交互的例子
Jul 19 Python
Python tkinter 下拉日历控件代码
Mar 04 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
学会python自动收发邮件 代替你问候女友
May 20 Python
通过cmd进入python的步骤
Jun 16 Python
一文搞懂如何实现Go 超时控制
Mar 30 Python
Pytorch实现图像识别之数字识别(附详细注释)
May 11 Python
OpenCV-Python实现人脸磨皮算法
Jun 07 Python
python绘图subplots函数使用模板的示例代码
教你怎么用Python处理excel实现自动化办公
解决python绘图使用subplots出现标题重叠的问题
python数据库批量插入数据的实现(executemany的使用)
Apr 30 #Python
Python如何把不同类型数据的json序列化
Apr 30 #Python
python实现三次密码验证的示例
Django一小时写出账号密码管理系统
You might like
人族 TERRAN 概述
2020/03/14 星际争霸
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
浅析PHP页面局部刷新功能的实现小结
2013/06/21 PHP
PHP进程通信基础之信号
2017/02/19 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
JavaScript遍历table表格中的某行某列并打印其值
2014/07/08 Javascript
延时加载JavaScript代码提高速度
2015/12/27 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
2016/07/09 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
2017/10/04 Javascript
jQuery niceScroll滚动条错位问题的解决方法
2018/02/03 jQuery
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
2018/07/10 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
python中__call__方法示例分析
2014/10/11 Python
Python基于有道实现英汉字典功能
2015/07/25 Python
python画微信表情符的实例代码
2019/10/09 Python
.dcm格式文件软件读取及python处理详解
2020/01/16 Python
python实现ip地址的包含关系判断
2020/02/07 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
浅谈python累加求和+奇偶数求和_break_continue
2020/02/25 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
python如何快速拼接字符串
2020/10/28 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
2018/07/12 HTML / CSS
个人自荐书
2013/12/20 职场文书
IT工程师岗位职责
2014/07/04 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
数据设计之权限的实现
2022/08/05 MySQL