Python - 拷贝 - 浅拷贝(Shallow Copy)和深拷贝(Deep Copy)

这篇具有很好参考价值的文章主要介绍了Python - 拷贝 - 浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python - 拷贝 - 浅拷贝(Shallow Copy)和深拷贝(Deep Copy)

前言

假设我以这样的方式创建一个3 x 5的二维数组:

a = [[0] * 5] * 3

然后我修改 a [ 2 ] [ 3 ] a[2][3] a[2][3]的值为 1 1 1

a[2][3] = 1

结果会发现数组 a a a中第二维坐标为 3 3 3的数全部被修改为了 1 1 1,而没有发生“第一维坐标为 2 2 2的数全部被改成了 1 1 1

print(a)  # [[0, 0, 0, 1, 0], [0, 0, 0, 1, 0], [0, 0, 0, 1, 0]]

原因

这就涉及到了Python中的拷贝机制。

Python中的数据按照其是否可以更改,可以分为两类:

  • 可变类型包括列表(list)、字典(dict)和集合(set)
  • 不可变类型包括整数(int)、浮点数(float)、布尔值(bool)、元组(tuple)和字符串(str)

深拷贝: 对于不可变类型(例如整数)进行复制操作时,会产生一个新的对象。对新对象的更改不会对旧对象造成影响:

a = 2
b = a
b = 1
print(a, b)  # 2 1
print(id(a), id(b))  # 2474931349840 2474931349808  # 不同

浅拷贝: 然而对于可变类型(例如列表)进行复制时,只会将对象的引用复制一份,它们实际指向同意对象。因此修改新的对象会对旧对象产生影响:

a = [1, 2, 3]
b = a
b[2] = 0
print(a, b)  # [1, 2, 0] [1, 2, 0]
print(id(a), id(b))  # 2537310019904 2537310019904  # 相同

注意对新对象的修改是指修改对象中的一部分,而不是让新对象指向另一个对象

a = [1, 2, 3]
b = a
b[0] = 0  # 修改对象中的一部分,这时a = [0, 2, 3]
b = [0]  # b指向了一个新的对象,原来的对象并没有被修改,这时a = [0, 2, 3]

这就解释了前言中的问题

[ 0 ] ∗ 5 [0] * 5 [0]5是将 0 0 0复制为5份, 0 0 0是不可变的整数,因此新列表 [ 0 , 0 , 0 , 0 , 0 ] [0, 0, 0, 0, 0] [0,0,0,0,0]中的每个 0 0 0都是独立的,修改其中一个 0 0 0不会影响到其他 0 0 0的值

但是 [ [ 0 , 0 , 0 , 0 , 0 ] ∗ 3 ] [[0, 0, 0, 0, 0] * 3] [[0,0,0,0,0]3]是将 [ 0 , 0 , 0 , 0 , 0 ] [0, 0, 0, 0, 0] [0,0,0,0,0]复制为5份, [ 0 , 0 , 0 , 0 , 0 ] [0, 0, 0, 0, 0] [0,0,0,0,0]是可变的列表,因此实质上是创建了 3 3 3个指向 [ 0 , 0 , 0 , 0 , 0 ] [0, 0, 0, 0, 0] [0,0,0,0,0]的对象,因此修改其中一个,另外两个也会随之变化。

但是:

a = [0] * 5
for i in range(5):
    print(id(a[i]), end=' ')
# 2977374300432 2977374300432 2977374300432 2977374300432 2977374300432  # 完全相同!!!
print(id(a[0] == id(a[1])))  # True
a[0] = 1
print(a)  # [1, 0, 0, 0, 0]
print(id(a[0]))  # 2977374300464
print(id(a[1]))  # 2977374300432
print(id(a[2]))  # 2977374300432
print(id(a[0]) == id(a[1]))  # False

也许是Py的优化?只有当修改不可变元素时才真的深拷贝?

TODO: import copy

可以研究一下 copy.copy()和copy.deepcopy()

原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/129972641文章来源地址https://www.toymoban.com/news/detail-402819.html

到了这里,关于Python - 拷贝 - 浅拷贝(Shallow Copy)和深拷贝(Deep Copy)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 原型模式和深拷贝,浅拷贝

    案例引入 克隆羊问题 有一只羊,姓名为tom,年龄为1,颜色为白色,编写程序创建和tom羊属性完全相同的羊。 传统方式解决 代码实现 传统实现方式分析 1.优点是好理解,简单易操作。 2.缺点进行新对象创建时,总是需要重新获取原始对象的属性,如果创建的对象复杂时,效

    2024年02月09日
    浏览(29)
  • 浅拷贝和深拷贝的区别

    1、浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。 2、深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何

    2024年02月15日
    浏览(27)
  • 什么是浅拷贝和深拷贝

    javascript 中有不同的方法来复制对象,那么我们怎样才能正确地复制一个对象呢? 本文来介绍一下浅拷贝和深拷贝。 一、什么是浅拷贝(Shallow Copy) 浅拷贝是创建一个新对象,新对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性

    2024年02月08日
    浏览(31)
  • js中浅拷贝和深拷贝的区别

    在JavaScript中,浅拷贝(Shallow Copy)和深拷贝(Deep Copy)是两种不同的复制对象的方法,它们之间存在一些重要的区别。 浅拷贝(Shallow Copy): 浅拷贝只复制对象的顶层属性,如果属性是对象或数组,则复制的是引用,而不是实际的对象。这意味着,如果更改了复制后的对象

    2024年01月20日
    浏览(26)
  • 详解python列表等对象的赋值和复制(浅拷贝copy()及深拷贝deepcopy()的使用区别与示例)

    python虽然没有指针的概念,但是对象、引用、地址这些内容还是存在的,尤其是像列表对象、某类型对象的引用上,搞清楚对象变量的复制和赋值很有必要,不然容易出现“莫名其妙”的错误。 python中给一个变量 a 赋值列表实际上是创建了一个列表对象,并将该列表的地址赋

    2024年02月04日
    浏览(34)
  • 理解C#中对象的浅拷贝和深拷贝

    本文章主要介绍C#中对象的拷贝,其中包括浅拷贝和深拷贝,以及浅拷贝和深拷贝的实现方式,不同的实现方式之间的性能对比。   浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象中引用

    2024年02月08日
    浏览(30)
  • java八股文面试[java基础]——浅拷贝和深拷贝

      自验证:创建Class Student两个类, Student中含有Class对象 测试代码: 输出: 可以看到不同的Student对象,但是有相同的Class对象 修改Student clone方法: 可以看到不同的class对象,不同的值: 知识来源: 【23版面试突击】什么是浅拷贝和深拷贝_哔哩哔哩_bilibili 强引用、弱引用介

    2024年02月11日
    浏览(29)
  • Dockerfile 指令 COPY 拷贝文件夹

    网上查了查资料,这里记录一下。         今天在编写 dockerfile 时使用 COPY 拷贝文件夹时遇到了意料之外的情况。在此记录一下正确的使用方法。         今天在通过 dockerfile 将文件夹拷贝到镜像的时候发现,是把文件夹下的内容拷贝进去了。 dockerfile 如下:     

    2024年01月18日
    浏览(41)
  • Kafka的零拷贝技术Zero-Copy

    流程步骤: (1)操作系统将数据从磁盘文件中读取到内核空间的页面缓存; (2)应用程序将数据从内核空间读入用户空间缓冲区; (3)应用程序将读到数据写回内核空间并放入socket缓冲区; (4)操作系统将数据从socket缓冲区复制到网卡接口,此时数据才能通过网络发送

    2024年02月08日
    浏览(31)
  • Secure Copy Protocol or SCP - 安全拷贝协议

    Secure Copy (remote file copy program) The SCP program is a software tool implementing the SCP protocol as a service daemon or client. It is a program to perform secure copying. The SCP server program is typically the same program as the SCP client. The SCP Server software can be installed on a Regular Machine and be configured to only accept SCP Traffic on

    2024年04月14日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包