首页 > 其他分享 >15 赋值、浅拷贝和深拷贝区别_is和==的区别

15 赋值、浅拷贝和深拷贝区别_is和==的区别

时间:2024-07-28 09:55:58浏览次数:15  
标签:15 区别 print 拷贝 copy True id append

 欢迎来到@一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力

对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:[email protected] 。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。

    专栏:

文章概述:对Python浅拷贝与深拷贝的介绍

关键词:Python浅拷贝与深拷贝

本文目录

Python浅拷贝与深拷贝

直接赋值代码示例

浅拷贝(copy):

深拷贝(deepcopy)

  

Python浅拷贝与深拷贝

  • 直接赋值:其实就是对象的引用(别名)。
  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

直接赋值代码示例

# 直接赋值
a = [11, 22, 33]
b = a

# 打印列表 b
print(b)  # 输出: [11, 22, 33]

# 打印内存地址(可选)
# print(id(a), id(b))

# 用来判定 a 和 b 地址和对应的值完全相等
print(a is b)  # True, 因为 b 是通过直接赋值引用了 a
print(a == b)  # True, 因为 a 和 b 的内容相同  (不是看是否地址相同)
#和java中不太一样,java中要么是数值比较大小,要么判断地址(是否是同一个对象)
c = {'name': 'baizhan'}
d = c
# print(id(c), id(d))
print(c is d) #True
print(c == d) #True

a.append(44)  
print(a)  #[11, 22, 33, 44]
print(b)  #[11, 22, 33, 44]
print(a is b)   #True
print(a == b)   #True

c['age'] = 21
print(c)  #{'name': 'baizhan', 'age': 21}
print(d)  #{'name': 'baizhan', 'age': 21}
print(a is b) #True
print(a == b) #True

浅拷贝(copy):

# 浅拷贝
a = [1, 2]
b = [3, 4]
c = [a, b]
d = c  # d 和 c 引用的是同一个对象

#浅拷贝
#只是给父级新开辟了一个空间,里面的子元素还是指向父级的子元素
import copy  #导入copy模块,模块里有深浅拷贝两个模块
e = copy.copy(c)
# 或者使用e=c.copy()  
'''c.copy()
来源:列表、字典等内置数据结构提供的 copy() 方法。
适用范围:只适用于提供了 copy() 方法的对象,如列表、字典和某些自定义类。'''
# print(id(c), id(d), id(e))
print(c is e)  # False, e 是一个新的对象
print(c == e)  # True, e 和 c 的内容相同


print(c[0] is d[0]) #true  完全相同
print(c[0] is e[0]) #true  子地址相同

a.append(5) 
b.append(6)
print(c)   #[[1, 2, 5], [3, 4, 6]]
print(d)   #[[1, 2, 5], [3, 4, 6]]
print(e)   #[[1, 2, 5, 5], [3, 4, 6, 6]]

深拷贝(deepcopy)

import copy

# 深拷贝
a = [1, 2]
b = [3, 4]
c = [a, b]
d = copy.deepcopy(c)
print(c is d)      #False
print(c[0] is d[0])#False
print(c[1] is d[1])#False

c.append(5)
print(c)
print(d)#没影响

a.append(3)
b.append(5)
print(c)  #[[1, 2], [3, 4], 5]
print(d)  #没影响[[1, 2], [3, 4]]


d[0].append(5)
d[1].append(6)
print(d)
print(c)#没影响

d.append(7)
print(d)
print(c)  #没影响

标签:15,区别,print,拷贝,copy,True,id,append
From: https://blog.csdn.net/ta683280/article/details/140747024

相关文章

  • PAT 乙级 1015题(为什么有测试点不对,求助)
    题目:德才论宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”现给出一批考生的德才分数,请根据司马光的理论给出录取排名。输入格式:输......
  • 代码随想录算法训练营第九天 | 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现
    151.翻转字符串里的单词题目链接:力扣题目链接文章讲解:代码随想录 视频讲解:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词思路这道题目可以说是综合考察了字符串的多种操作。其实这道题和反转字符串这道题目很像,而且用法也是通用的方法一:切片,reverse,以及......
  • nginx 配置代理服务地址最后多加反斜杠和不加反斜杠的区别
    在使用Nginx配置代理服务时,地址最后是否添加反斜杠(/)会对代理的URL处理产生影响。1.地址最后不加反斜杠当配置的代理服务地址最后没有反斜杠时,Nginx会将请求的URL路径原封不动地传递给后端服务器。例如:location/backend/{proxy_passhttp://backend-server;}请......
  • 15.C语言形式参数和实际参数的介绍及函数总结
    形参和实参的介绍及函数总结1.形式参数和实际参数2.获取两个最大的数3.关于函数的一些总结1.形式参数和实际参数实际参数可以是常量、变量、表达式y=get(1);//常量y=get(x);//变量y=get(x+1);//表达式形参和实参数值相同,地址不同(传递参数是数值的传递......
  • vue2和vue3的区别
    总结:1、vue2的双向数据绑定利用了es5的apiobject.definepropert(),而vue3中使用了es6的apiproxy;2、vue3支持碎片,而vue2不支持;3、vue2使用选项类型api,而vue3使用合成型api;4、建立数据,vue2把数据放入data属性中,而vue3使用setup()方法;5、vue3有teleport组件,vue2没有。1......
  • 15、flask-模型-models-表的操作-多表操作-一对多
    这里选择学生表和班级表作为案例app.pyfromAppimportcreate_appapp=create_app()if__name__=='__main__':app.run(debug=True)#运行:flaskrun--debugviews.pyimportrandomfromflaskimportBlueprint,request,render_templatefrom.modelsimpo......
  • 【C++】unsigned char与short的区别?
    unsignedchar与short的区别unsignedchar和short(通常为signedshort或简称为short)是C/C++中两种不同的整数数据类型。它们的主要区别在于存储大小、表示范围和是否带符号。存储大小:unsignedchar 通常占用1字节(8位)的存储空间。short 的大小依平台而定,但通常是2字节......
  • 力扣-415-字符串相加
    思路是模拟从低位到高位的按位相加,需要考虑进位publicStringaddStrings(Stringnum1,Stringnum2){intbitLen1=num1.length()-1,bitLen2=num2.length()-1;StringBuilderstringBuilder=newStringBuilder();intcarry=0;......
  • 【MySQL】MySQL基础知识:什么是主键?什么是外键?主键和外键有什么区别?外键有什么问题?
    在关系型数据库系统中,如MySQL,主键(PrimaryKey)和外键(ForeignKey)是两个基本且重要的概念,它们在数据库设计和数据维护中扮演着重要的角色。本文将从主键和外键的基本概念入手,详细解析它们之间的区别,并探讨外键在实际应用中可能遇到的问题。......
  • 【操作系统/C++ malloc 1KB和1MB 有什么区别?brk | mmap】
    关于malloc如何根据请求的内存大小选择使用brk还是mmap的机制,是glibc(GNUCLibrary)中malloc实现的一个常见策略,尽管具体的阈值(如128KB)可能会因glibc的不同版本或配置而有所不同。brkbrk是一个系统调用,用于改变数据段的结束地址(即“程序断点”)。在UNIX和类U......