一、Python对象
在Python中一切皆对象。Python中构造的任何数据类型都是一个对象,不管是数字、字符串、字典等常见的数据结构,还是函数,甚至我们导入的模块等,Python都会把它当做是一个对象来处理。
Python对象拥有三个属性:
- 身份
- 类型
- 值
对象在内存中的地址表明他的身份,通过id方法查看
类型表示对象可以存储什么类型的数据
值就是具体变量的值
二、Python深拷贝和浅拷贝概念理解
(1)浅拷贝
只拷贝原数据的首地址,然后通过原数据的首地址去获取内容
(2)深拷贝
开辟一块新内存,将被拷贝内容全部拷贝过来。
(3)优缺点对比
深拷贝:拷贝成都高,将原数据复制到新的内存空间中。改变拷贝后的内容不影响原数据内容。但是深拷贝耗时长,且占用内存空间。
浅拷贝:拷贝程度低,只复制原数据的地址,其实是将副本的地址指向原数据地址。修改副本内容,是通过当前地址指向原数据地址去修改,所以修改副本内容会影响原数据内容。浅拷贝耗时短,占用内存空间少。
三、具体实例理解
首先理解Python对象的存储。正如前面所说,Python开辟一个地址存储一个对象,主要有三个属性,分别是身份、类型、值。
对于不同的数据类型,存储策略有所不同
- 整数
对于aa=1234,这一Python语句进行存储,会开辟一块内存存储
- 字符串
对于单个字符串,会开辟一块内存进行存储,如aa='1';对于多字符,如aa='1234', 会开辟两级内存进行存储
对于列表,当列表中元素为空时,只会开辟一个内存进行存储,当列表中元素大于等于1时,就会开辟多级内存进行存储
知道存储的机制后,结合深copy和浅copy 的概念,就会发现
浅copy只会把第一级内存进行copy,如果原数据第一级所存储的ID发生变化,那么不会影响浅copy的值,如果元数据第一级之后的内存发生变化,那么就会影响的浅copy的值
而深copy是,将对象的每一级存储进行了复制,所以原数据的无论怎么变化都不会影响深copy 的值