首先Python提供了三种赋值方法,最常见的是赋值=、浅拷贝copy.copy()和深拷贝copy.deepcopy()。

赋值是使用等于号(=),可以对一个变量进行赋值,赋值就是创建了对象的一个新的引用,赋值并不会产生一个独立的对象,它只是给原有的数据对象添加一个新的标签。所以当其中的一个标签被改变的时候,数据对象就会发生变化,另一个标签也会随之改变。Python中的赋值都是进行对象的引用传递,即内存地址的传递。

浅拷贝是使用copy.copy(),可以进行对象的浅拷贝,浅拷贝只拷贝对象本身,并不会拷贝对象内部的嵌套对象。对于内部的嵌套对象依然使用原始的引用。

深拷贝使用copy.deepcopy()可以进行对象的深拷贝,深拷贝会拷贝对象本身以及其所有的嵌套对象。因为深拷贝会将被复制的对象完全再复制一遍,所以深拷贝后的对象会作为新个体单独存在,所以,当我们尝试改变原有对象,不会对已经复制出来的新对象产生影响。

下面coding下做个尝试,通过代码理解其中的思想。

首先,可以肯定的是赋值、深浅拷贝都能将传递对象。

还是看代码,我将原对象a添加了一个数字4,我们看运行结果,a,b随之变化,c,d未变化。

当我给对象a中的内嵌对象添加一个元素'c'运行结果如下:a,b随之改变,浅拷贝后的对象c也随之变化,深拷贝还是无动于衷。。。

原因如下:

当我去修改对象a,对象a会变化,对象b因为是赋值过来的,传递的是对象a的内存地址,所以对象b也会随着对象a的变化。
深拷贝是无论怎么改动原来的对象a,深拷贝后的新对象d是不会随之变化的。也就是可以这样理解,深拷贝后的新对象与原对象无关。
我们将对象理解为一个人,赋值就是再完完全全复制出一个新的你,原来的你有什么变化,新的你就会发生什么变化,新旧同步。
浅拷贝就是可变的部分会随原对象变化(列表、字典、集合),不可变的部分(数值、字符串、元组)不会随之变化。
还是拿人举例,不可变的比如血型,可变的比如面容。
浅拷贝出来的新的你,不可变的部分是不会随着原来的你发生变化的,可变的部分会随着原来的你发生变化。
原来的你是A型血了,但是被注入了O型血,新的你还是A型血,原来的你整容了,新的你会随之整容。

【python】深拷贝、浅拷贝和赋值之间有什么区别?相关推荐

  1. python什么时候用框架_关于python:框架和对象之间有什么区别,什么时候应该修改另一个?...

    我开始阅读python的+=语法,无意中发现了以下文章/答案:关于的交互式代码+= 所以我注意到帧和对象之间似乎有区别. . 在全局框架中,它们指向同一对象,即使它们是不同的变量:如果 l2 += [ ...

  2. python赋值浅拷贝和深拷贝的区别_浅拷贝、深拷贝和普通赋值操作有什么区别?...

    对于不可变对象,创建副本没有多大意义,因为它们不会改变.对于可变对象^{},^{}和^{}的行为不同.让我们用例子来讨论它们. 赋值操作只是将源的引用赋值给目标,例如:>>> i = ...

  3. 对象克隆-深拷贝,浅拷贝,直接赋值

    1背景分析 在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值.浅拷贝.深拷贝 这三种方式,我们常用的对象的转化方式,使用的是spring的 BeanUtils.co ...

  4. python定义数组并赋值_python中的数组赋值与拷贝的区别详解

    具体的注解我已经写在了程序里面:通俗的解释了python里面的浅拷贝与深拷贝的不同,请看程序. # -*- coding: utf-8 -*- import numpy as np import co ...

  5. C++搞懂深拷贝初始化=与赋值(运算符重载)=的区别

    C++搞懂深拷贝初始化=与赋值(运算符重载)=的区别 C++构造函数用=与()不完全一样,注意使用=时c++中临时变量不能作为非const的引用参数,不论是=运算符重载还是构造函数,否则可能出现以下错 ...

  6. python怎样给对象赋值_Python对象赋值、浅拷贝和深拷贝

    总结: 1.copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象 2.copy.deepcopy 深拷贝 拷贝对象及其子对象 1.对象赋值 will = ["Will&quo ...

  7. python深拷贝,浅拷贝,赋值引用

    1.在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 (1)直接赋值,默认浅拷贝传递对象的引用而已 ...

  8. python中对象的赋值、浅拷贝和深拷贝

    1. 赋值:简单的对象引用 在python中,变量赋值实际上是简单的对象引用.在创建一个对象后,再把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是简单地拷贝了这个对象的引用. (1)原 ...

  9. Python 中的对象赋值、浅拷贝和深拷贝

    一.对象赋值 首先,创建了一个名为 will 的变量,这个变量指向一个 list 对象,从第一张图中可以看到所有对象的地址(每次运行,结果可能不同) 然后,通过 will 变量对 wilber 变量进 ...

最新文章

  1. 图的算法专题——最小生成树
  2. C#抽象类和抽象方法的特征和用途
  3. The Rise of Algorithmic Labourin China: Platform, Technology and Delivery Workers
  4. symfony api 错误响应_Postman for Mac(API管理开发软件)
  5. silverlight 上下标
  6. CVPR2019 | 弱监督图像分类建模
  7. oracle锁表与解表
  8. Qt学习之路3---Qt中的坐标系统
  9. Gym - 101128F Landscaping(网络流)
  10. ESXI5.1 数据备份与恢复
  11. Ubuntu安装显卡驱动
  12. STM32入门指南(0)—配置开发环境
  13. 微信扫一扫下载apk 微信直接下载APK(APP)的解决方案
  14. Vue 关闭浏览器清除Cookies
  15. 哪里可以买到苹果手机原装电池?
  16. 12306排队是什么意思_12306的排队机制是什么样的?
  17. HTTP Status 404(The requested resource is not available)(转)
  18. 网络通信、UDP通信、TCP通信、BS架构模拟、URL了解
  19. 如何进入机械革命官网 下载驱动
  20. 每个人心里都有一座巴别塔-The dogs of babel巴别塔之犬

热门文章

  1. elementui-input限制输入正整数
  2. 删除列表中重复值,重复值保留一个
  3. 给出语言无符号整数的文法
  4. 三个月5位老员工离职!苹果健康团队被曝内部分歧严重,员工扎堆儿离开
  5. 单片机开发的两种类型
  6. java代码审查检查表
  7. Java常量池理解与总结(讲的非常浅显易懂)
  8. DTO与实体类的区别
  9. 【win10】电脑蓝牙开关找不到了的解决方法
  10. 基于stm32的蓝牙开关