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实现2048小游戏
Mar 30 Python
Python最基本的输入输出详解
Apr 25 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
python format 格式化输出方法
Jul 16 Python
基于tensorflow加载部分层的方法
Jul 26 Python
Python字符串逆序输出的实例讲解
Feb 16 Python
Python同步遍历多个列表的示例
Feb 19 Python
不到20行代码用Python做一个智能聊天机器人
Apr 19 Python
python 实现dict转json并保存文件
Dec 05 Python
python 实现turtle画图并导出图片格式的文件
Dec 07 Python
Python map及filter函数使用方法解析
Aug 06 Python
python绘图subplots函数使用模板的示例代码
教你怎么用Python处理excel实现自动化办公
解决python绘图使用subplots出现标题重叠的问题
python数据库批量插入数据的实现(executemany的使用)
Apr 30 #Python
Python如何把不同类型数据的json序列化
Apr 30 #Python
python实现三次密码验证的示例
Django一小时写出账号密码管理系统
You might like
PHP之autoload运行机制实例分析
2014/08/28 PHP
使用GD库生成带阴影文字的图片
2015/03/27 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
你真的了解JavaScript吗?
2007/02/24 Javascript
类之Prototype.js学习
2007/06/13 Javascript
15 个 JavaScript Web UI 库
2010/05/19 Javascript
javascript定时保存表单数据的代码
2011/03/17 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
layui table 参数设置方法
2018/08/14 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python网络编程学习笔记(五):socket的一些补充
2014/06/09 Python
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
python读写ini配置文件方法实例分析
2015/06/30 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
通过实例学习Python Excel操作
2020/01/06 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
物流创业计划书
2014/02/01 职场文书
《老王》教学反思
2014/02/23 职场文书
园艺师求职信
2014/04/27 职场文书
感恩母亲节演讲稿
2014/05/07 职场文书
学术诚信承诺书
2014/05/26 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
大学生英文求职信范文
2015/03/19 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
2015年营业员工作总结
2015/04/23 职场文书