首页 > 编程语言 >Python中级之深浅拷贝

Python中级之深浅拷贝

时间:2023-12-06 19:57:08浏览次数:38  
标签:old Python 对象 objects 深浅 new 拷贝 copy

深浅拷贝

Python源码对深浅拷贝的解释

  • 以下来源于Python源码中对copy的解释
# 英文原文
The difference between shallow and deep copying is only relevant for
compound objects (objects that contain other objects, like lists or
class instances).

- A shallow copy constructs a new compound object and then (to the
  extent possible) inserts *the same objects* into it that the
  original contains.

- A deep copy constructs a new compound object and then, recursively,
  inserts *copies* into it of the objects found in the original.

Two problems often exist with deep copy operations that don't exist
with shallow copy operations:

 a) recursive objects (compound objects that, directly or indirectly,
    contain a reference to themselves) may cause a recursive loop

 b) because deep copy copies *everything* it may copy too much, e.g.
    administrative data structures that should be shared even between
    copies

Python's deep copy operation avoids these problems by:

 a) keeping a table of objects already copied during the current
    copying pass

 b) letting user-defined classes override the copying operation or the
    set of components copied

This version does not copy types like module, class, function, method,
nor stack trace, stack frame, nor file, socket, window, nor any
similar types.
# 中文翻译
浅拷贝和深拷贝的区别仅在于复合对象(包含其他对象的对象,如列表或类实例)方面。

- 浅拷贝构建一个新的复合对象,然后(在可能的范围内)将*与原对象相同的对象*插入其中。
- 深拷贝构建一个新的复合对象,然后递归地插入其中原始对象的*副本*。

深拷贝操作通常存在两个问题,而浅拷贝操作则不存在:

a) 递归对象(直接或间接地包含对自身引用的复合对象)可能导致递归循环

b) 因为深拷贝会复制*所有内容*,可能复制过多,例如,应该在拷贝之间共享的管理数据结构

Python 的深拷贝操作通过以下方式避免这些问题:

a) 在当前拷贝过程中保持一个已复制对象的表

b) 允许用户定义的类覆盖拷贝操作或要复制的组件集

这个版本不会复制诸如模块、类、函数、方法、堆栈跟踪、堆栈帧、文件、套接字、窗口等类型。

代码解释

import copy
# 浅拷贝 外层嵌套
copy_old = [1, 2, [3, 4]]
copy_new = copy.copy(copy_old)
copy_old.append(5)
print(copy_new, id(copy_new))   # [1, 2, [3, 4]] 2557819770432      # 浅拷贝的对象
print(copy_old, id(copy_old))   # [1, 2, [3, 4], 5] 2557819770176   # 被复制的对象

# 浅拷贝 嵌套中的可迭代对象
copy_old = [1, 2, [3, 4]]
copy_new = copy.copy(copy_old)
copy_old[2].append(5)
print(copy_new, id(copy_new))   # [1, 2, [3, 4, 5]] 2406245488192   # 可迭代对象浅拷贝的对象
print(copy_old, id(copy_old))   # [1, 2, [3, 4, 5]] 2406245487936   # 被复制的对象

print('浅拷贝与深拷贝的区别'.center(20,'>'))

# 深拷贝
copy_old = [1, 2, [3, 4]]
copy_new = copy.deepcopy(copy_old)
copy_old.append(5)
copy_old[2].append(5)
print(copy_new, id(copy_new))   # [1, 2, [3, 4]] 2259169924672
print(copy_old, id(copy_old))   # [1, 2, [3, 4, 5], 5] 2259169924416
# 深拷贝不管使修改外层列表还是嵌套列表,拷贝过的内容都不会有所改变

标签:old,Python,对象,objects,深浅,new,拷贝,copy
From: https://www.cnblogs.com/Lea4ning/p/17880380.html

相关文章

  • Python中级之列表字典推导式和三元运算符
    列表生成式列表生成式是一种在Python中用于创建列表的简洁和优雅的语法。它允许你使用一行代码生成一个新的列表,而不必使用传统的循环语句。以下是列表生成式的基本语法:[expressionforiteminiterableifcondition]expression:用于生成新列表中每个元素的表达式。ite......
  • 【python入门之异常处理】---python 异常处理
    title:【python入门之异常处理】---python异常处理date:2023-12-0619:14:26updated:2023-12-0619:40:00description:【python入门之异常处理】---python异常处理cover:https://home.cnblogs.com/u/dream-ze/【一】什么是异常异常是程序运行时可能发......
  • python中for循环用法
    1、在python中完整的for语法如下#for变量in集合:#循环代码#else:#没有通过的break退出循环,结束后会执行代码2、应用场景在迭代变量嵌套的数据类型时,列表【数组】中包括多个字典【键值对存放的值:用{key:value}】需求:要判断某一个字典中是否存在......
  • python入门之深浅拷贝】---python 深浅拷贝
    title:【python入门之深浅拷贝】---python深浅拷贝date:2023-12-0618:54:06updated:2023-12-0619:20:00description:【python入门之深浅拷贝】---python深浅拷贝cover:https://zhuanlan.zhihu.com/p/631965597https://home.cnblogs.com/u/dream-ze/【......
  • # yyds干货盘点 # 分享一个Python网络爬虫数据采集利器
    前言你是否曾为获取重要数据而感到困扰?是否因为数据封锁而无法获取所需信息?是否因为数据格式混乱而头疼?现在,所有这些问题都可以迎刃而解。让我为大家介绍一款强大的数据收集平台——亮数据BrightData。作为世界领先的数据收集平台,亮数据以其高效、可靠和灵活的方式检索提取关键的......
  • [Python急救站]火车购票程序
    火车购票程序如果要一直执行程序,加个while循环即可。要是要智能判断月份,可以通过调取当前时间进行判断即可。print("""1、每年的1-3月和7-9月凭学生证可以打5折。2、10人(含10人)以上团购还可以打9折。""")i=eval(input("请输入单张火车票的全价:(1~1000):"))a=input("是否为......
  • 深浅拷贝
    深浅拷贝1.浅拷贝浅拷贝是指创建一个新对象,并将原始对象的元素复制到新对象中#num_list=[1,2,[3,4]]##使用浅拷贝创建拷贝对象#copy_list=copy.copy(num_list)###修改原对象中的可变数据类型#num_list[2].append(5)##print("原对象:",num_list) #[1,......
  • 深浅拷贝问题
    深浅拷贝问题copy.copy浅拷贝copy.deepcopy深拷贝浅拷贝copy.copycopy.copy浅拷贝原来的拷贝对象------拷贝出了一个新的对象修改原对象------原对象必须改变-----新对象也会随着原对象的改变而改变。总结:复制一份原来的对象,如果原来的对象中存在可变数据类型,那么修......
  • python
    conda虚拟环境使用conda创建虚拟环境后,正常情况激活并进入环境后,执行condainstall会安装到自己的环境,并且执行pipinstall也会安装到envs/环境名/lib/python3.8/site-packages目录下。但是我用服务器的时候,发现pipinstall竟然安装到别人的conda虚拟环境中了,经过漫长的搜索,解决......
  • Python - pandas DataFrame数据的合并与拼接(merge、join、concat)
    Python-pandasDataFrame数据的合并与拼接(merge、join、concat)0概述pandas包的merge、join、concat方法可以完成数据的合并和拼接。merge方法主要基于两个dataframe的共同列进行合并;join方法主要基于两个dataframe的索引进行合并;concat方法是对series或dataframe进行行......