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线程池的实现实例
Nov 18 Python
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
使用python调用浏览器并打开一个网址的例子
Jun 05 Python
零基础写python爬虫之爬虫的定义及URL构成
Nov 04 Python
Python语法快速入门指南
Oct 12 Python
python pandas修改列属性的方法详解
Jun 09 Python
Python 实现域名解析为ip的方法
Feb 14 Python
Python中整数的缓存机制讲解
Feb 16 Python
Pycharm+Python工程,引用子模块的实现
Mar 09 Python
python 字典item与iteritems的区别详解
Apr 25 Python
利用Python实现某OA系统的自动定位功能
May 27 Python
python爬取某网站原图作为壁纸
Jun 02 Python
python绘图subplots函数使用模板的示例代码
教你怎么用Python处理excel实现自动化办公
解决python绘图使用subplots出现标题重叠的问题
python数据库批量插入数据的实现(executemany的使用)
Apr 30 #Python
Python如何把不同类型数据的json序列化
Apr 30 #Python
python实现三次密码验证的示例
Django一小时写出账号密码管理系统
You might like
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
微信access_token的获取开发示例
2015/04/16 PHP
php session的锁和并发
2016/01/22 PHP
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
js中string和number类型互转换技巧(分享)
2016/11/28 Javascript
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
JS实现简易计算器
2020/02/14 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
微信小程序接入vant Weapp组件的详细步骤
2020/10/28 Javascript
vue穿梭框实现上下移动
2021/01/29 Vue.js
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
压缩包密码破解示例分享(类似典破解)
2014/01/17 Python
在Linux下调试Python代码的各种方法
2015/04/17 Python
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
Django中的session用法详解
2020/03/09 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
公安机关正风肃纪剖析材料
2014/10/10 职场文书
个人整改措施书面材料
2014/10/24 职场文书
市场部岗位职责
2015/02/12 职场文书
2015年七夕爱情寄语
2015/03/24 职场文书
爱的教育观后感
2015/06/17 职场文书
边城读书笔记
2015/06/29 职场文书
mysql部分操作
2021/04/05 MySQL