Python详细讲解浅拷贝与深拷贝的使用

目录
  • 1.变量的赋值操作
  • 2.浅拷贝
  • 3.深拷贝
  • 4.总结

1.变量的赋值操作

只是多生成了一个变量,实际上还是指向同一个对象

# -*- coding: utf-8 -*-
class CPU:
    pass
class Disk:
    pass
class Computer:
    def __init__(self, cpu, disk):  # 给对象的实例属性进行初始化
        self.cpu = cpu
        self.disk = disk
# 变量的赋值
cp1 = Computer(cpu='CPU', disk='DISK')  # 创建CPU类的实例对象
cp2 = cp1
# 变量的赋值,一个对象的实例采用两个变量存储,实际上还是指向一个对象
print(cp1, id(cp1))
print(cp2, id(cp2))

赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。

2.浅拷贝

Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象

# -*- coding: utf-8 -*-
import copy
class CPU:
    pass
class Disk:
    pass
class Computer:
    def __init__(self, cpu, disk):  # 给对象的实例属性进行初始化
        self.cpu = cpu
        self.disk = disk
cpu = CPU()  # 创建一个 CPU 类的实例对象
disk = Disk()  # 创建一个Disk 类对象
computer = Computer(cpu, disk)  # 创建一个Computer类的实例对象
# 浅拷贝
print(cpu)
print(disk)
computer2 = copy.copy(computer)  # 子对象不拷贝
print(computer, computer.cpu, computer.disk)
print(computer2, computer2.cpu, computer2.disk)
# 类的浅拷贝:
# Python的拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝
# 因此,源对象与拷贝对象会引用同一个子对象

浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用

(如果用引用的方式修改其中一个对象,另外一个也会修改改变)

哪些是浅拷贝:

{1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}

3.深拷贝

使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同

# -*- coding: utf-8 -*-
import copy
class CPU:
    pass
class Disk:
    pass
class Computer:
    def __init__(self, cpu, disk):  # 给对象的实例属性进行初始化
        self.cpu = cpu
        self.disk = disk
cpu = CPU()  # 创建一个 CPU 对象
disk = Disk()  # 创建一个硬盘类对象
computer = Computer(cpu, disk)  # 创建一个计算机类对象
# 深拷贝
computer1 = copy.deepcopy(computer)
print(computer, computer.cpu, computer.disk)
print(computer1, computer1.cpu, computer1.disk)
# 类的深拷贝
# 使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象
# 源对象和拷贝对象所有的子对象也不同

深拷贝:创建一个新的对象,并且递归的复制它所包含的对象。

修改其中一个,另外一个不会改变。因此,新对象和原对象没有任何关联。

例如:{copy模块的deepcopy()函数}

4.总结

最直观的理解就是:

1.浅拷贝,拷贝的程度浅,只拷贝原数据的首地址,然后通过原数据的首地址,去获取内容。

2.深拷贝,拷贝的程度深,自己新开辟了一块内存,将被拷贝内容全部拷贝过来了;

到此这篇关于Python详细讲解浅拷贝与深拷贝的使用的文章就介绍到这了,更多相关Python浅拷贝与深拷贝内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Python直接赋值,深拷贝和浅拷贝

    直接赋值: 对象的引用,也就是给对象起别名 浅拷贝: 拷贝父对象,但是不会拷贝对象的内部的子对象. 深拷贝: 拷贝父对象. 以及其内部的子对象 在之前的文章中,提到可变对象和不可变对象,接下来也是以这两者的区别进行展开 直接赋值 对于可变对象和不可变对象,将一个变量直接赋值给另外一个变量,两者 id 值一致,其实本质上是将变量量绑定到对象的过程. >>> a=1 >>> b=a >>> id(a) == id(b) True >>>

  • Python深拷贝浅拷贝图文示例清晰整理

    python共有两种浅拷贝的方法,一个是python的内置函数copy(),另一个是copy模块中的copy.copy(). python的六种数据类型(数字.字符串.列表.元组.字典.集合)中,数字.字符串.元组这三个不可变类型是没有copy()这个属性的,但是可以用copy.copy()进行浅复制. 本文以copy模块中的copy()和deepcopy()来说说两者的区别. 如上图所示,浅拷贝只拷贝了父对象,不会拷贝里面的子对象.如果拷贝的数据改变了父对象中的值,是不会影响源数据中父对象的值

  • python 中赋值,深拷贝,浅拷贝的区别

    目录 一.赋值实例 二.浅拷贝实例 三.深拷贝实例 赋值:其实就是对象的引用(相当于取别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象内部的子对象,会引用子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象. 一.赋值实例 # a这个大列表是一个父对象,里面的小列表是a的一个子对象 a = [1, 2, 3, ["a", "b"]] # 赋值实例 b = a print("a:", a

  • Python深拷贝与浅拷贝引用

    目录 (1).存在父对象和子对象 (2).如果只存在父对象 前言: 在Python中,对象赋值在本质上是对对象的引用,当创建一个对象把它赋值给另一个变量的时候,Python并没有拷贝这个对象,而只是拷贝了这个对象的引用,这里通过程序,借用Python中的copy模块进一步理解深拷贝.浅拷贝和对象赋值有什么不同. 这里分两种情况: (1).存在父对象和子对象 演示代码如下: import copy   #调用copy模块 Dict = {'animal':'cat','num':[10,20,30

  • Python可变与不可变数据和深拷贝与浅拷贝

    目录 浅拷贝和深拷贝 什么是可变数据和不可变数据 那么拷贝函数是干什么的? 浅拷贝 深拷贝 总结 浅拷贝和深拷贝 拷贝函数是专门为可变数据类型list.set.dict使用的一种函数.作用是,当一个值指向另一个值的时候,也不会影响指向的值,如果被指向的数据是可变数据,那么它一旦被修改,指向的数据也会随之改变. 什么是可变数据和不可变数据 我们来举一个例子,整型是不可变的数据,那么为什么是不可变的数据呢?一个数据是不是可变的就要关系到python的缓存机制. 当一个数据发生变化,如果它的内存地址没

  • Python中深拷贝与浅拷贝的区别介绍

    首先,我们知道 Python 中有6个标准的数据类型,他们又分为可以变和不可变.不可变:Number(数字).String(字符串).Tuple(元组).可以变:List(列表).Dictionary(字典).Set(集合). 浅拷贝 改变原始对象中为可变类型的元素的值,会同时影响拷贝对象.改变原始对象中为不可变类型的元素的值,不会响拷贝对象. 代码演示 import copy #定义一个列表,其中第一个元素是可变类型. list1 = [[1,2], 'fei', 66]; #进行浅copy

  • Python基础之赋值,浅拷贝,深拷贝的区别

    一.赋值 不会开辟新的内存空间,只是复制了新对象的引用.所以当一个数据发生变化时,另外一个数据也会随之改变. 二. 浅拷贝 创建新对象,其内容是对原对象的引用.浅拷贝之所以称为浅拷贝,是因为它仅仅只拷贝了第一层,即只拷贝了最外层的对象本身,内部的元素都只是拷贝了一个引用而已,即内部元素如果被修改,则另外一个数据也会发生变化. 浅拷贝的三种形式: A = [1, 2, 3, 4] 切片操作 # 第1种 B = A[:] # 第2种 B = [a for a in A] 工厂函数 B = list(

  • Python列表的浅拷贝与深拷贝

    目录 一.浅拷贝(均是只对第一层进行深拷贝) 1.for循环依次赋值 2.使用copy()函数 3.使用列表生成式 4.使用索引[:] 二.深拷贝 对列表深拷贝就是无论怎样改动新列表(单维or多维),原列表都不变. 而下面的浅拷贝,对于多维列表,只是第一维深拷贝了(嵌套的List保存的是地址,复制过去的时候是把地址复制过去了),所以说其内层的list元素改变了,原列表也会变. 一.浅拷贝(均是只对第一层进行深拷贝) 1. for循环依次赋值 old = [1, [1, 2, 3], 3] new

  • Python 的赋值,浅拷贝和深拷贝详解

    目录 先明确几点 赋值 浅拷贝 深拷贝 总结 先明确几点 不可变类型:该数据类型对象所指定内存中的值不可以被改变. (1).在改变某个对象的值时,由于其内存中的值不可以被改变,所以,会把原来的值复制一份再进行改变,这样就会计算机会开辟一段新的内存空间来存储新的值. 可变类型:该数据类型的对象所指定的地址上面的值可以被改变. (1).变量被改变后,其所指向的内存地址上面的值,直接被改变,没有发生复制行为,也没有发生开辟新的内存地址行为,不会重新开辟空间. 变量:是一个系统表的元素,拥有指向对象的连

  • Python详细讲解浅拷贝与深拷贝的使用

    目录 1.变量的赋值操作 2.浅拷贝 3.深拷贝 4.总结 1.变量的赋值操作 只是多生成了一个变量,实际上还是指向同一个对象 # -*- coding: utf-8 -*- class CPU: pass class Disk: pass class Computer: def __init__(self, cpu, disk): # 给对象的实例属性进行初始化 self.cpu = cpu self.disk = disk # 变量的赋值 cp1 = Computer(cpu='CPU',

  • 深入理解python中的浅拷贝和深拷贝

    在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b 为什么我只对b进行修改,却影响到了a呢?看过我在之前的文章中就说过:序列中保存的都是内存的引用. 所以,当我们通过b去修改里面的空列表的时候,其实就是修改内存中的同一个对象,所以会影响到a. a = ['scolia', 123, [], ] b = a[:] print id(a), id(a[0]), id(

  • Python详细讲解图像处理的而两种库OpenCV和Pillow

    目录 一.简介 1.1 图像处理-OpenCV 1.2 图像处理- PIL和Pillow 二. 常用图像类型 2.1 二值图像 2.2 灰度图像 2.3 RGB图像 2.4 常用颜色空间简介 三.OpenCV图像读写与显示 3.1 读入图像 3.2 显示图像 3.3 写出图像 四.图像几何变换 4.1 图像平移 4.2 图像旋转 4.3 图像缩放 一.简介 实现计算机视觉任务的过程中,不可避免地需要对图像进行读写操作以及图像预处理操作,下面介绍两个常用的Python图像处理库:OpenCV和Pi

  • 对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

    对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解 列表赋值: >>> a = [1, 2, 3] >>> b = a >>> print b [1, 2, 3] >>> a[0] = 0 >>> print b [0, 2, 3] 解释:[1, 2, 3]被视作一个对象,a,b均为这个对象的引用,因此,改变a[0],b也随之改变 如果希望b不改变,可以用到切片 >>> b = a[:] &

  • 对python append 与浅拷贝的实例讲解

    在做Leetcode的第39题的时候,看到网上一个用递归的解法,很简洁.于是重写了一遍. class Solution(object): def combinationSum(self, candidates, target): """ :type candidates: List[int] :type target: int :rtype: List[List[int]] """ result,temp = [],[] self.combina

  • Python浅拷贝与深拷贝用法实例

    本文实例讲述了Python浅拷贝与深拷贝用法.分享给大家供大家参考.具体分析如下: >>> person=['name',['savings',100]] >>> hubby=person[:] >>> wifey=list(person) >>> [id(x) for x in person,hubby,wifey] [3074051788L, 3074061740L, 3074061996L] >>> [id(y

  • Python中的赋值、浅拷贝、深拷贝介绍

    和很多语言一样,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式. 在学习过程中,一开始对浅拷贝理解很模糊.不过经过一系列的实验后,我发现对这三者的概念有了进一步的了解. 一.赋值 赋值算是这三种操作中最常见的了,我们通过一些例子来分析下赋值操作: str例 复制代码 代码如下: >>> a = 'hello' >>> b = 'hello' >>> c = a >>> [id(x) for x in

  • Python基础教程之浅拷贝和深拷贝实例详解

    Python基础教程之浅拷贝和深拷贝实例详解            网上关于Python的深拷贝和浅拷贝的文章很多,这里对三种拷贝进行比较并附实例,大家可以参考下 一般的复制 #encoding:utf-8 #定义一个嵌套集合 lista=[1,2,3,[4,5,6,[7,8,9]]] listb=lista #分别打印出 lista和listb的地址值 print id(lista) #4511103096 print id(listb) #4511103096 #修改lista中的内容,li

随机推荐