参考

  1. https://docs.python.org/3/library/copy.html?highlight=copy copy#copy.copy
  2. https://en.wikipedia.org/wiki/Object_copying#Shallow_copy

Fluent Python第四部分第8章

A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.

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

Note:

  1. 直接赋值:其实就是对象的引用(别名)。
  2. 浅复制(shallow copy):copy模块的copy方法,复制父对象,不会复制对象的内部的子对象。
  3. 深复制(deepcopy): copy 模块的 deepcopy 方法,完全复制了父对象及其子对象。

    注意,浅复制和深复制都创建新的对象,所以id()返回的值不同。浅复制的元素使用原始元素的引用(地址),而深复制的元素重拥有新的地址(即深复制copy everything).

    深复制符合我们的认知,复制返回的对象就是一个完全独立的对象。

例子1. 浅复制

import copy
origin_dict = {
1 : [1,2,3]
}
#浅复制可以引入copy模块或者compound objects自带的copy()
#shcp_didct = origin_dict.copy()
shcp_dict = copy.copy(origin_dict) print(id(origin_dict))
print(id(shcp_dict)) print(origin_dict[1].append(555)) print(origin_dict)
print(shcp_dict)

例子2. 深复制

#深复制必须引入copy模块
import copy
origin_dict = {
1 : [1,2,3]
} shcp_dict = copy.deepcopy(origin_dict) print(id(origin_dict))
print(id(shcp_dict)) print(origin_dict[1].append(555)) print(origin_dict)
print(shcp_dict)

Python中的浅复制、深复制的更多相关文章

  1. [Python]Python中的浅复制与深复制

    看python的文档,发现list有copy方法,描述说效果同a[:]. 感觉有点惊讶,之前一直以为a[:]执行的是深复制. test了一下,发现确实如果a中存在可变对象,如list/set/dict ...

  2. Python学习日记之字典深复制与浅复制

    Python中通过copy模块有两种复制(深复制与浅复制) copy 浅复制 复制时只会复制父对象,而不会复制对象的内部的子对象. deepcopy 深复制 复制对象及其子对象 因此,复制后对原dic ...

  3. python学习(7)关于列表操作相关命令以及浅复制深复制

    在python中,[]表示的是列表.列表有各种操作命令. 1.append()方法,添加一个元素到列表尾部. 注意append()方法与extend()方法有区别:list.append(object ...

  4. Python中对象的引用与复制

    在python进行像b = a这样的赋值时,只会创建一个对a的新引用,使a的引用计数加1,而不会创建新的对象: >>> a = 'xyz' >>> import s ...

  5. Javascript中的一种深复制实现

    在javascript中,所有的object变量之间的赋值都是传地址的,可能有同学会问哪些是object对象.举例子来说明可能会比较好: typeof(true) //"boolean&qu ...

  6. java 浅复制 深复制

    1.浅复制 只是复制引用,对引用的操作会影响之前复制的对象. 2.深复制 复制一个完全独立的对象,复制对象与被复制对象相互之间不影响. 只是概念性东西....

  7. python中的赋值操作和复制操作

    之前一直写C#,变量之间赋值相当于拷贝,修改拷贝变量不会改变原来的值.但是在python中发现赋值操作本质是和C++中的引用类似,即指向同一块内存空间.下面通过一个例子说明: p=[0,1,2,3,4 ...

  8. Python赋值、浅复制和深复制

    Python赋值.浅复制和深复制 ​ 首先我们需要知道赋值和浅复制的区别: 赋值和浅复制的区别 赋值,当一个对象赋值给另一个新的变量时,赋的其实是该对象在栈中的地址,该地址指向堆中的数据.即赋值后,两 ...

  9. java 及 Jquery中的深复制 浅复制

    发现问题:最近 遇到由于复制对象之后,改变复制后的新变量,原先被复制的对象居然会跟着变. EX:java中: //holidayConfig.getEnd_time()会随着sTime的改变而改变 s ...

随机推荐

  1. goland 2019.1.1破解

    https://blog.csdn.net/hi_liuxiansheng/article/details/89078405

  2. AcWing 826. 单链表

    https://www.acwing.com/activity/content/problem/content/863/1/ #include <iostream> using names ...

  3. centos 7 pip install MySQL-python 报错

    pip install MySQL-python 报错 pip install MySQL-python DEPRECATION: Python . Please upgrade your Pytho ...

  4. MFC程序使用控制台打印

    1.在OnCreate窗口创建方法中调用控制台窗口创建方法,创建的窗口是与MFC主窗口共存亡的 参考地址:https://blog.csdn.net/Yong_Qi2015/article/detai ...

  5. Nginx之server和location配置使用

    配置server代码段: server { server_name www.meiduo.site; listen ; root /home/python/Desktop/meiduo_mall_ad ...

  6. 如何预测股票分析--先知(Prophet)

    在上一篇中,我们探讨了自动ARIMA,但是好像表现的还是不够完善,接下来看看先知的力量! 先知(Prophet) 有许多时间序列技术可以用在股票预测数据集上,但是大多数技术在拟合模型之前需要大量的数据 ...

  7. rabbitmq 命令行与控制台

    命令行和管控台 rabbitmqctl stop_app 关闭应用 rabbitmqctl start_app 打开应用 rabbitmqctl status 节点状态 rabbitmqctl add ...

  8. vue 项目太大, 导致 javascript heap out of memory

    原因: node 环境, 对单个进程的内存是有限制的, 但是现在前端项目太大, 所以我们需要根据当前机器环境, 手动加大node的内存限制 安装包 npm i increase-memory-limi ...

  9. JS高级---复习

    复习 面向过程和面向对象都是编程的思想, 方式不一样 面向过程: 凡事都是亲力亲为, 所有的代码都要自己写, 每一步都要很清楚, 注重的是过程 面向对象: 执行者成为指挥者, 只要找对象, 然后让对象 ...

  10. 洛谷P1044栈(DP)

    题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即poppoppop(从栈顶弹出一个元素)和pushpushpush(将一个元素进栈) ...