Python 的赋值,浅拷贝和深拷贝详解
作者:季布, 发布时间:2023-08-18 12:28:04
目录
先明确几点
赋值
浅拷贝
深拷贝
总结
先明确几点
不可变类型:该数据类型对象所指定内存中的值不可以被改变。
(1)、在改变某个对象的值时,由于其内存中的值不可以被改变,所以,会把原来的值复制一份再进行改变,这样就会计算机会开辟一段新的内存空间来存储新的值。
可变类型:该数据类型的对象所指定的地址上面的值可以被改变。
(1)、变量被改变后,其所指向的内存地址上面的值,直接被改变,没有发生复制行为,也没有发生开辟新的内存地址行为,不会重新开辟空间。
变量:是一个系统表的元素,拥有指向对象的连接空间
对象:被分配的一块内存,存储其所代表的值
引用:是自动形成的从变量到对象的指针
当在代码编辑器中写出
test = 'python'
python解释器会
1.创建变量test
2.创建一个对象(分配一块内存),来存储python值
3.将变量与对象通过指针
链接起来,从变量到对象的连接称为引用(变量引用对象)
赋值
复制了新对象的引用,不会开辟新的内存空间
浅拷贝
拷贝父对象,不会拷贝对象内部的子对象。
1)浅拷贝是指拷贝的只是原对象元素的引用,换句话说,浅拷贝产生的对象本身是新的,但是它的内容不是新的,只是对原对象的一个引用。
2)浅拷贝是指把存放变量的地址值传给被赋值,最后两个变量引用了同一份地址。
深拷贝
深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。深拷贝出来的对象是一个全新的对象,不再与原来的对象有任何关联。所有改变原来被赋值对象不会对已经复制出来的新对象产生影响
对于不可变对象的深浅拷贝示例
import copy
test = 'abc'
print("=====赋值=====")
b=test
print(test)
print(b)
print(id(test))
print(id(b))
print("=====浅拷贝=====")
b=copy.copy(test)
print(test)
print(b)
print(id(test))
print(id(b))
print("=====深拷贝=====")
b=copy.deepcopy(test)
print(test)
print(b)
print(id(test))
print(id(b))
结果
=====赋值=====
abc
abc
1855476943856
1855476943856
=====浅拷贝=====
abc
abc
1855476943856
1855476943856
=====深拷贝=====
abc
abc
1855476943856
1855476943856
通过以上可得出结果:
不可变类型没有被拷贝的说法,不管怎么样id地址都一样
对于可变对象深浅拷贝示例
import copy
test=[1,2,3]
print("=====赋值=====")
b=test
print(test)
print(b)
print(id(test))
print(id(b))
print("=====浅拷贝=====")
b=copy.copy(test)
print(test)
print(b)
print(id(test))
print(id(b))
print("=====深拷贝=====")
b=copy.deepcopy(test)
print(test)
print(b)
print(id(test))
print(id(b))
结果
=====赋值=====
[1, 2, 3]
[1, 2, 3]
2461497814592
2461497814592
=====浅拷贝=====
[1, 2, 3]
[1, 2, 3]
2461497814592
2461497661824
=====深拷贝=====
[1, 2, 3]
[1, 2, 3]
2461497814592
2461497661888
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象
b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝
a.append(5) #修改对象a
a[4].append('c') #修改对象a中的['a', 'b']数组对象
print( 'a = ', a )
print( 'b = ', b )
print( 'c = ', c )
print( 'd = ', d )
结果
('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
('d = ', [1, 2, 3, 4, ['a', 'b']])
1.外层添加元素时,浅拷贝不会随原列表变化而变化;内层添加元素时浅拷贝才会变化
2.无论源列表如何变化,深拷贝都保持不变
3.复制对象随原列表一起变化
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
来源:https://blog.csdn.net/weixin_47906106/article/details/121970384


猜你喜欢
- 本文实例讲述了python实现控制电脑鼠标和键盘,登录QQ的方法。分享给大家供大家参考,具体如下:import osfrom pynput.
- 需求:建立年级、班级两个数据表,获取年级表信息,根据年级,获取相应的班级效果图:不完美的地方就是在不选择年级的时候,是不能选择任何班级的。代
- 概述相信我们经常会遇到这样的场景:想要了解双十一天猫购买化妆品的人员中平均消费额度是多少(这可能有利于对商品价格区间的定位);或者不同年龄段
- 隐藏你的.php文件 隐藏你的.php文件 今天做PHP在线手册镜像的时候看到了这个方法,哈哈,以前都没有注意到,所以说,手册是
- 主键与外键的关系,通俗点儿讲,我现在有一个论坛,有两张表,一张是主贴 thread,一张是回帖 reply先说说主键,主键是表里面唯一识别记
- 点阵字体是指根据文字的像素点来显示的字体,效果如下:使用Python读取并显示的过程如下:根据中文字符获取GB2312编码通过GB2312编
- 相信很多人在使用正则表达式的时候都会遇到如下的语句:通过查阅正则表达式的API文档可以了解到正则表达式的语法知识:很多小伙伴就会产生疑问为什
- 在某些情况下,如果明知道查询结果只有一个,SQL语句中使用LIMIT 1会提高查询效率。 例如下面的用户表(主键id,邮箱,密码): cre
- 通过第三方库exifread读取照片信息。exifread官网:https://pypi.org/project/ExifRead/一、安装
- 最近打算把我们的微信端用Vue.js重构,为什么选择Vue.js,一是之前使用的是传统的asp.net mvc,多页面应用用户体验比单页面要
- 一个Javascript 的类库,用于table内容排序。使用很方便,不用每次都去调用数据库了。特别适合多表查询的排序。加上<tbod
- 本文列举了所有关于PHP语言中使用socket相关服务的一些函数。注意使用如下函数之前,你需要确保你的socket已打开,如果你没有打开,请
- 文本如图:Python:import sysresult=[]with open('accounts.txt','r
- 本文实例讲述了Python 25行代码实现的RSA算法。分享给大家供大家参考,具体如下:网络上很多关于RSA算法的原理介绍,但是翻来翻去就是
- 方法一:<script language="JavaScript"> <!--
- 前言用python编程绘图,其实非常简单。中学生、大学生、研究生都能通过这10篇教程从入门到精通!快速绘制几种简单的柱状图。1垂直柱图(普通
- 1、流程控制流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑。流程控制包含分三大类:条件判断,
- atom(一款开源的代码编辑器)是github专门为程序员推出的一个跨平台文本编辑器。具有简洁和直观的图形用户界面,并有很多有趣的特点:支持
- 很多人都听过WAMP这个词吧,首先来看WAMP是什么意思?Windows下的Apache+MySQL+PHP,称为WAMP。属于WAMP环境
- 本文实例讲述了Python操作MySQL简单实现方法。分享给大家供大家参考。具体分析如下:一、安装:安装MySQL安装MySQL不用多说了,