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的深拷贝与浅拷贝。建议还是自己尝试一下。

 

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

目录
相关文章
|
1月前
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
21 1
|
1月前
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
25 2
|
1月前
|
设计模式 开发者 Python
Python类里引用其他类
Python类里引用其他类
|
1月前
|
设计模式 开发者 Python
Python 类中引用其他类的实现详解
Python 类中引用其他类的实现详解
40 1
WK
|
1月前
|
Python
Python类命名
在Python编程中,类命名至关重要,影响代码的可读性和维护性。建议使用大写驼峰命名法(如Employee),确保名称简洁且具描述性,避免使用内置类型名及单字母或数字开头,遵循PEP 8风格指南,保持项目内命名风格一致。
WK
14 0
|
1月前
|
程序员 开发者 Python
深度解析Python中的元编程:从装饰器到自定义类创建工具
【10月更文挑战第5天】在现代软件开发中,元编程是一种高级技术,它允许程序员编写能够生成或修改其他程序的代码。这使得开发者可以更灵活地控制和扩展他们的应用逻辑。Python作为一种动态类型语言,提供了丰富的元编程特性,如装饰器、元类以及动态函数和类的创建等。本文将深入探讨这些特性,并通过具体的代码示例来展示如何有效地利用它们。
39 0
|
1月前
|
Python
Python中的类(一)
Python中的类(一)
|
1月前
|
Python
Python中的类(一)
Python中的类(一)
|
1月前
|
Python
Python中的类(二)
Python中的类(二)
|
1月前
|
开发者 Python
Python类和子类的小示例:建模农场
Python类和子类的小示例:建模农场
下一篇
无影云桌面