2018-08-22
- 对象的创建,依赖于申请的内存空间中数据的加载,对象在内存中的创建过程依赖于三部分内存处理:对象分配内存地址、引用变量和引用变量之间的关系
参考代码:
from memory_profiler import profile
class Person:
''' 自定义类型 '''
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
@profile(precision=10)
def main():
''' 入口函数 '''
p = Person("tom", 18, "男")
print(p)
p2 = Person("tom", 18, "男")
print(p)
if __name__ == "__main__":
# 运行代码
main()
执行内存处理:
image.png内存分配图解:
对于对象的创建,是将堆内存中的对象的地址临时存储在栈内存中变量中,那么在程
序中如果要在多个地方使用一个对象数据时应该怎么办呢?一般想到的都是将对象像文件
一样复制一份不就好了。
Python中对于这样的情况,有三种不同的操作方式:
如果程序中多个不同的地方都要使用同一个对象,通过对象的引用赋值,将同一个对象赋值给多个变量
如果程序多个不同的地方都要使用相同的数据,通过对象的拷贝完成数据的简单复制即可,对象中的包含的数据必须统一
如果程序中多个不同的地方使用相同的对象数据,通过对象的深层次的复制,将对象的数据完整复制成独立的另一份即可
对象的引用赋值:
可以将对象的内存地址同时赋值给多个变量,这个变量中存放的都是同一个对象的引用地址,如果通过一个变量修改了对象内容,那么其他变量指向的对象内容也会发生改变
将一个变量中存放的对象的地址数据,赋值给其他变量,通过赋操作符号就可以完成
image.png
对象的引用变量的赋值,并不是对象的赋值和备份,而仅仅是将对象的地址存储在多个变量中方便程序操作
image.png
注意:PYTHON 中所谓对象的引用赋值,针对的是可变类型,不论是组合数据类型或者自定
义 class 类型,都具备引用赋值的操作;但是不适合不可变类型,不可变类型的引用赋值
操作有只读不写的特征,一旦通过变量重新赋值就会重新指向新的引用对象
image.png
对象的浅拷贝
对于程序中对象的拷贝操作,除了前面介绍的引用赋值操作可以完成同一个对象在程序不
同位置的操作,这里的浅拷贝更是一种对象的临时备份,浅拷贝的核心机制主要是赋值对象
内部数据的引用
PYTHON 内建标准模块 copy 提供了一个 copy 函数可以完成:
对象的深拷贝:
和对象的浅拷贝不同,对象的深拷贝,是对象数据的直接拷贝,而不是简单的引用拷贝
主要是通过 PYTHON 内建标准模块 copy 提供的 deepcopy 函数可以完成对象深拷贝 :
image.png
网友评论