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访问纯真IP数据库的代码
May 19 Python
python清除函数占用的内存方法
Jun 25 Python
Python pandas实现excel工作表合并功能详解
Aug 29 Python
Python生成词云的实现代码
Jan 14 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
Python读取配置文件(config.ini)以及写入配置文件
Apr 08 Python
pycharm的python_stubs问题
Apr 08 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
Jun 04 Python
Python3.9新特性详解
Oct 10 Python
python自动化发送邮件实例讲解
Jan 04 Python
python爬虫今日热榜数据到txt文件的源码
Feb 23 Python
python源文件的字符编码知识点详解
Mar 04 Python
python绘图subplots函数使用模板的示例代码
教你怎么用Python处理excel实现自动化办公
解决python绘图使用subplots出现标题重叠的问题
python数据库批量插入数据的实现(executemany的使用)
Apr 30 #Python
Python如何把不同类型数据的json序列化
Apr 30 #Python
python实现三次密码验证的示例
Django一小时写出账号密码管理系统
You might like
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
php生成二维码图片方法汇总
2016/12/17 PHP
PHP实现文件上传与下载
2020/08/28 PHP
PHP数组实际占用内存大小原理解析
2020/12/11 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
2015/11/09 Javascript
微信小程序 wx.uploadFile无法上传解决办法
2016/12/14 Javascript
vue.js源代码core scedule.js学习笔记
2017/07/03 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
示例vue 的keep-alive缓存功能的实现
2018/12/13 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
Vue解析带html标签的字符串为dom的实例
2019/11/13 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
Python的MongoDB模块PyMongo操作方法集锦
2016/01/05 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
给我一面国旗 python帮你实现
2019/09/30 Python
opencv python在视屏上截图功能的实现
2020/03/05 Python
Django框架实现在线考试系统的示例代码
2020/11/30 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
上班看电影检讨书
2014/02/12 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python
Python数据可视化之基于pyecharts实现的地理图表的绘制
2021/06/10 Python
Golang表示枚举类型的详细讲解
2021/09/04 Golang
Python极值整数的边界探讨分析
2021/09/15 Python
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle