首页 > 编程语言 >Python 高阶内容:深拷贝与浅拷贝揭秘复制的“玄学”

Python 高阶内容:深拷贝与浅拷贝揭秘复制的“玄学”

时间:2024-09-21 15:22:59浏览次数:12  
标签:Copy Python 对象 复制 print 拷贝 copy 高阶

Python 高阶内容:深拷贝与浅拷贝揭秘复制的“玄学”

文章目录

在 Python 中,复制操作并不是简单地将对象内容重新创建,而是存在着深拷贝(Deep Copy)和浅拷贝(Shallow Copy)两种方式。浅拷贝只是复制对象本身,不包括内部嵌套的子对象;如果内部对象被修改,原始对象也会受到影响。而深拷贝则是递归地复制对象及其所有子对象,生成一个完全独立的副本,确保原对象和副本之间互不影响。浅拷贝通常通过对象的 .copy() 方法或切片操作实现,适用于对象中不包含可变子对象或希望共享子对象的情况。而深拷贝则需要使用 copy 模块中的 deepcopy() 函数,适用于需要完全独立的副本,避免任何联动修改的场景。

掌握这两种拷贝方式的区别与应用,可以帮助开发者在不同场景下更好地管理数据和内存。本文通过实例详解了深拷贝与浅拷贝的不同特点及适用场景,帮助你轻松理解这一看似“玄学”的知识点。

一 copy 数据

复制本质是复制地址和复制值。

示例一
l = [1, 2, 3]
_l = l.copy()
_l[0] = -1
print(_l)
print(l)

运行的之后

[-1, 2, 3]
[1, 2, 3]
示例二
l = [[1], [2], 3]
_l = l.copy()
_l[0][0] = -1
print(_l)
print(l)

运行的之后

[[-1], [2], 3]
[[-1], [2], 3]

运行后,发现,源列表居然变了,再来看一个实例。

audio = File("mp3")
file = File("txt")
l = [audio, file]
_l = l.copy()
_l[0].name = "mp4"
print(audio.name)  
# 运行之后 "mp4"

运行之后源列表是 mp3 的,怎么被复制后的列表改变成了 mp4 。

二 深拷贝与浅拷贝

Python 中复制,有两种方式,一种是深拷贝,一种是浅拷贝。

深拷贝是 Deep Copy,浅拷贝是 Shallow Copy,Deep copy 就是我们通常意义上的复制,把东西全部再造了一遍,彻底成为了两个独立的个体。 而Shallow Copy, 其实也有一点影子拷贝的意思,我复制出来的是你的一个影子,一个投影成像。 所以真实的实体是没有被复制的,我只复制了这个实体的一个投影而已。这里有点绕。划重点 Python 对数值字符的复制是直接复制的值,浅复制的优势就是。复制是需要内存和时间的,因为浅复制没有真正复制,所以并不需要耗多少内存和时间。

那如何拷贝出互不影响的实例列表呢?对存放实例的列表做 Deep Copy 深拷贝。

    from copy import deepcopy
    l = [[1], [2], 3]
    _l = deepcopy(l)
    _l[0][0] = -1
    print(_l)
    print(l)

三 copy 对比

基本概念对比
比较项浅拷贝(Shallow Copy)深拷贝(Deep Copy)
定义仅复制对象本身,内部的子对象仍然引用原始对象的子对象递归地复制对象及其所有子对象,生成全新的副本
对象关系新对象与原对象共享可变的子对象新对象与原对象完全独立,修改互不影响
适用场景对象中不包含可变的子对象,或希望共享子对象的情况需要完全独立的副本,避免任何联动修改的情况
实现方式对比
比较项浅拷贝实现方法深拷贝实现方法
内置方法使用对象的 .copy() 方法
copy 模块copy.copy(obj)copy.deepcopy(obj)
列表特有切片操作:new_list = original_list[:]
示例代码shallow_copied_list = copy.copy(original_list)
shallow_copied_list = original_list[:]
deep_copied_list = copy.deepcopy(original_list)

四 完整代码示例

# This is a sample Python script.

# Press ⌃R to execute it or replace it with your code.
# Press Double ⇧ to search everywhere for classes, files, tool windows, actions, and settings.


def print_hi(name):
    # Use a breakpoint in the code line below to debug your script.
    print(f'Hi, {name}')  # Press ⌘F8 to toggle the breakpoint.
    # 我的确复制了呀, 复制数值
    # 复制本质是复制地址和复制值
    l = [1, 2, 3]
    _l = l.copy()
    _l[0] = -1
    print(_l)
    print(l)
    # 看看这个示例
    l = [[1], [2], 3]
    _l = l.copy()
    _l[0][0] = -1
    print(_l)
    print(l)
    # 运行后,发现,源列表居然变了,再来看一个实例
    audio = File("mp3")
    file = File("txt")
    l = [audio, file]
    _l = l.copy()
    _l[0].name = "mp4"
    print(audio.name)  # "mp4"
    # 源列表是 mp3 的,怎么被复制后的列表改变成了 mp4
    # Python 中复制,有两种方式,一种是深拷贝,一种是浅拷贝。
    # 深拷贝与浅拷贝
    # 深拷贝是 Deep Copy,浅拷贝是 Shallow Copy
    # Deep copy 就是我们通常意义上的复制,把东西全部再造了一遍,彻底成为了两个独立的个体。 而
    # Shallow Copy, 其实也有一点影子拷贝的意思,我复制出来的是你的一个影子,一个投影成像。 所以真实的实体是没有被复制的,我只复制了这个实体的一个投影而已。
    # Python 对数值字符的复制,直接是复制的值
    # 对存放实例的列表做 Deep Copy 深拷贝
    from copy import deepcopy
    l = [[1], [2], 3]
    _l = deepcopy(l)
    _l[0][0] = -1
    print(_l)
    print(l)


class File:
    def __init__(self, name):
        self.name = name


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    print_hi('复制的"玄学"')

# See PyCharm help at https://www.jetbrains.com/help/pycharm/

复制粘贴并覆盖到你的 main.py 中运行,运行结果如下。

Hi, 复制的"玄学"
[-1, 2, 3]
[1, 2, 3]
[[-1], [2], 3]
[[-1], [2], 3]
mp4
[[-1], [2], 3]
[[1], [2], 3]

五 源码地址

代码地址:

国内看 Gitee复制的"玄学".py

国外看 GitHub复制的"玄学".py

引用 莫烦 Python

标签:Copy,Python,对象,复制,print,拷贝,copy,高阶
From: https://blog.csdn.net/u014394049/article/details/142410985

相关文章

  • Python 高阶内容:简化代码的终极技巧
    Python高阶内容:简化代码的终极技巧文章目录Python高阶内容:简化代码的终极技巧一Lambda:更直接的Function1常规函数写法和调用2lambda写法二一行`for`能解决的事1常规写法2简写3简写创建字典三一行if-else行天下1常规写法2简写四一行`for+`判......
  • 数据中台升级之旅:解析数据飞轮的本质与高阶变迁
    在当今数据驱动业务发展的新时代,很多组织都面临着如何高效利用数据以驱动增长和创新的问题。数据飞轮和数据中台作为核心的技术和架构概念,常常被提及。尽管两者都以数据为燃料,但它们在实施目标和运作模式上存在本质的不同。通过详细分析这些差异,我们可以更好地理解如何构建有效的数......
  • Python数论应用
    引言        在前面的课程中,我们已经学习了Python的基本输入输出、数据类型及其转换、顺序结构、分支结构、循环结构、循环控制语句、字符串类型、列表类型、元组类型、字典类型、集合类型、函数的定义与使用、函数调用与作用域、函数的高级应用、质数、倍数与余数......
  • 中国电子学会202406青少年软件编程(Python)等级考试试卷(四级)真题
    青少年软件编程(Python)等级考试试卷(四级)2024-6一、单选题(共25题,共50分)1.执行以下程序后所输出的结果是?()A   20   B   41   C   21   D   912.以下说法错误的是?()A  python中可以在不同的自定义函数中声明相同名字的变量,使用时不会造成数据混乱B......
  • 中国电子学会202403青少年软件编程(Python)等级考试试卷(四级)真题
    202403Python四级真题一、选择题1、运行如下代码,若输入整数3,则最终输出的结果为?()deff(x):    ifx==1:        s=1    else:        s=f(x-1)*x    returnsn=int(input("请输入一个大于1的整数:"))print(f(n)+f(n......
  • 基于python的opencv图像处理基本操作
    一、如何下载opencv包在Python中下载OpenCV包,最常用的方法是使用pip命令。pip是Python的包安装工具,可以方便地从Python包索引(PyPI)安装和管理包。以下是一些基本的步骤和命令,帮助你通过pip安装OpenCV。在命令行中输入以下命令来安装OpenCV:pipinstallopencv-python在国内使......
  • 在 Ubuntu 20.04 服务器上安装 Python 3 并设置编程环境的方法
    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。简介Python编程语言越来越受到初学者和经验丰富的开发人员的青睐。Python灵活多变,在脚本编写、自动化、数据分析、机器学习和后端开发等方面具有优势。Python首次发布于......
  • python中函数式编程与高阶函数,装饰器与生成器,异常处理与日志记录以及项目实战
    函数式编程是Python强大且灵活的编程范式之一,与此同时,Python也为开发者提供了高阶函数、装饰器、生成器等工具,极大提高了代码的可读性和复用性。此外,异常处理与日志记录是编写可靠、可维护的Python代码的重要组成部分。最后,通过一个项目实战来整合这些概念。我们将从......
  • 计算机毕设设计推荐-基于python+Djanog大数据的电影数据可视化分析
    精彩专栏推荐订阅:在下方主页......
  • 【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
    文章目录C++类与对象前言读者须知RVO与NRVO的启用条件如何确认优化是否启用?1.按值传递与拷贝省略1.1按值传递的概念1.2示例代码1.3按值传递的性能影响1.3.1完全不优化1.4不同编译器下的优化表现1.4.1VisualStudio2019普通优化1.4.2VisualStudio2022激进......