Python(三十二)python类的浅拷贝与深拷贝

简介: Python中的对象复制,深拷贝与浅拷贝

Python中的对象复制,深拷贝与浅拷贝

一:直接赋值

直接赋值: 其实就是对象的引用(别名)。

python

复制代码

class Cpu(object):
    count = 0
    disk = ''
    def __init__(self,disk):
        self.count += 1
        self.disk = disk
    def useCpu(self):
        self.count += 1
class Disk(object):
    def useDisk(self):
        print("使用Disk")
# 直接赋值
print("直接赋值------------------------------")
Cpu1 = Cpu(Disk())
Cpu2 = Cpu1
print("Cpu1地址为:", id(Cpu1))
print("Cpu2地址为:", id(Cpu2))

输出:

lua

复制代码

直接赋值------------------------------
Cpu1地址为: 2787239672904
Cpu2地址为: 2787239672904

变量Cpu1 和 Cpu2的对象id是相同的,因此,Cpu2就是Cpu1的引用。

我们来简单的验证一下:

scss

复制代码

Cpu1.useCpu()
print("cpu1中的count值为:", Cpu1.count)
print("cpu2中的count值为:", Cpu2.count)

输出:

复制代码

cpu1中的count值为: 2
cpu2中的count值为: 2

 

我们执行Cpu1对象中的useCpu方法,count加1,值为2

我们输出Cpu2对象中的count属性,值也是2

二:浅拷贝

浅拷贝(copy) 拷贝父对象,不会拷贝对象的内部的子对象。

浅拷贝需要使用到python中的 copy模块中的copy方法,我们来修改一下上边的代码

python

复制代码

import copy
class Cpu(object):
    count = 0
    disk = ''
    def __init__(self,disk):
        self.count += 1
        self.disk = disk
    def useCpu(self):
        self.count += 1
class Disk(object):
    def useDisk(self):
        print("使用Disk")
# 直接赋值
print("直接赋值------------------------------")
Cpu1 = Cpu(Disk())
print("浅拷贝------------------------------")
Cpu3 = copy.copy(Cpu1)
print("Cpu1地址为:", id(Cpu1))
print("Cpu3地址为:", id(Cpu3))
Cpu1.useCpu()
print("Cpu1.disk的地址为:", id(Cpu1.disk))
print("Cpu3.disk的地址为:", id(Cpu3.disk))
print("Cpu1.count的地址为:", id(Cpu1.count))
print("Cpu3.count的地址为:", id(Cpu3.count))

输出:

lua

复制代码

浅拷贝------------------------------
Cpu1地址为: 2359483460936
Cpu3地址为: 2359483461512
Cpu1.disk的地址为: 2359483461256
Cpu3.disk的地址为: 2359483461256
Cpu1.count的地址为: 140726589890992
Cpu3.count的地址为: 140726589890960

 

查看输出结果,我们可以看到,变量Cpu1与Cpu3两个变量的地址是不同的,Cpu1中的count与cpu2中的count是不同的,但是Cpu1中的disk对象与Cpu2中的disk对象的地址是相同的,这个就是我们的浅拷贝。

Python中的拷贝没有特殊说明的时候,默认都指浅拷贝。

三:深拷贝

深拷贝(deepcopy)  copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

深拷贝需要使用到python中的 copy模块中的deepcopy方法,我们来修改一下上边的代码

声明类的代码不变,这里修改一下拷贝的代码

bash

复制代码

# print("深拷贝------------------------------")
Cpu4 = copy.deepcopy(Cpu1)
print("Cpu1地址为:", id(Cpu1))
print("Cpu4地址为:", id(Cpu4))
Cpu1.useCpu()
print("Cpu1.disk的地址为:", id(Cpu1.disk))
print("Cpu4.disk的地址为:", id(Cpu4.disk))
print("Cpu1.count的地址为:", id(Cpu1.count))
print("Cpu4.count的地址为:", id(Cpu4.count))

输出:

lua

复制代码

深拷贝------------------------------
Cpu1地址为: 2529781644744
Cpu4地址为: 2529781590856
Cpu1.disk的地址为: 2529781645064
Cpu4.disk的地址为: 2529781588040
Cpu1.count的地址为: 140726047580592
Cpu4.count的地址为: 140726047580560

 

深拷贝就是所有的变量都重新拷贝了一份。

 

以上大概就是python的深拷贝与浅拷贝。建议还是自己尝试一下。

 

有好的建议,请在下方输入你的评论。

目录
相关文章
|
28天前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。
|
6月前
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
134 11
|
9月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
383 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
7月前
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
131 1
|
10月前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
171 2
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
120 1
WK
|
Python
Python类命名
在Python编程中,类命名至关重要,影响代码的可读性和维护性。建议使用大写驼峰命名法(如Employee),确保名称简洁且具描述性,避免使用内置类型名及单字母或数字开头,遵循PEP 8风格指南,保持项目内命名风格一致。
WK
182 0
|
程序员 开发者 Python
深度解析Python中的元编程:从装饰器到自定义类创建工具
【10月更文挑战第5天】在现代软件开发中,元编程是一种高级技术,它允许程序员编写能够生成或修改其他程序的代码。这使得开发者可以更灵活地控制和扩展他们的应用逻辑。Python作为一种动态类型语言,提供了丰富的元编程特性,如装饰器、元类以及动态函数和类的创建等。本文将深入探讨这些特性,并通过具体的代码示例来展示如何有效地利用它们。
218 0
|
Python
Python中的类(一)
Python中的类(一)
92 0

热门文章

最新文章

推荐镜像

更多