Python(对象与内存)(浅拷贝与深拷贝)

191 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

🌞欢迎来到python的世界 
🌈博客主页:卿云阁
💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
🌠本阶段属于筑基阶段之一,希望各位仙友顺利完成突破
📆首发时间:🌹2021年12月17日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!

T500定制 (28).jpg

  0️⃣✨✨✨整数和短小的字符✨✨✨      

1、python内存管理机制是什么?
1). 由于 python 中万物皆对象,内存管理机制就是对象的存储问题, Python 会分配一块内存空间去存储对象。 2) 对于整数和短小的字符等, python 会执行缓存机制,即将这些对象进行缓存,不会为相同的对象分配多个内存空间
3). 容器对象,如列表、元组、字典等,存储的其他对象,仅仅是其他对象的引用,即地址,并不是这些对象本身 Python 对小整数的定义是 [-5,257),注意左闭右开, 这些整数对象是提前建立好的,不会被垃圾回收。在一个Python的程序中, 所有位于这个范围内的整数使用的都是同一个对象.

a=100
b=100
c=a
print(id(a))
print(id(b))
print(id(c))


结果:
1551333536
1551333536
1551333536


1️⃣✨✨✨判断对象和对象的关系✨✨✨

判断对象和对象的关系:
PYTHON 提供了对象判断符 is 和内容判断符==
A is B:判断对象 A 和对象 B 是否同一个内存地址,即是否同一个对象
A == B:判断 A 中的内容是否和 B 中的内容一致
isinstance(a, A)判断对象是否属于某一种类型


2️⃣✨✨✨字符串驻留机制✨✨✨

创建新的字符串对象时,Python 先比较常量池中是否有相同的对象( interned ),有的话则将指针指向已有对象,并减少新对象的指针,新对象由于没有引用计数,就会被垃圾回收机制回收掉,释放出内存。

a='a b'
b='a b'
print(id(a))
print(id(b))


结果
1868537789216
1868537789216


3️⃣✨✨✨可变对象与不可变对象✨✨✨ 

不可变对象

a=('a','b')
b=('a','b')
print(id(a))
print(id(b))


结果
1868533654920
1868537105608

可变对象

x=y=[1,2,3]
print(id(x))
print(id(y))
x.append(4)
print(id(x))
print(id(y))
z=[1,2,3]
print(id(z))
w=[1,2,3,4]
print(id(w))


结果
1868533747080
1868533747080
1868533747080
1868533747080
1868537966792
1868537916744


4️⃣✨✨✨浅拷贝与深拷贝✨✨✨ 

如果程序中多个不同的地方都要使用同一个对象怎么办?一共有三种解决方式:
1.对象的引用赋值
2.对象的浅拷贝
3.对象的深拷贝
1.首先对象的引用赋值是指:(只适用于可变的数据类型)
将对象的内存地址同时赋值给多个变量,多个变量指向的是同一个内存地址,
如果通过一个变量修改了对象内容,那么其他变量指向的对象内容也会同步发生改变,
多个变量指向的地址相同.

acc10=['qingyun',['credit',0.0]]
acc11=acc10
print(id(acc10))
print(id(acc11))





结果
139708482577544
139708482577544

2.对象的浅拷贝:
切片操作:acc1[:]
对象实例化:list[acc1]
copy模块的copy()函数:copy.copy(acc1)
(1)切片操作:acc1[:]

acc1=['qingyun',['credit',0.0]]
acc2=acc1[:]
print(id(acc1))
print(id(acc2))



结果
139869809464520
139869795569928

(2) 对象实例化:list[acc1]

acc1=['qingyun',['credit',0.0]]
acc2=list(acc1)
print(id(acc1))
print(id(acc2))





结果
139945907213448
139946096918024

(3) copy模块的copy()函数:copy.copy(acc1)

import copy
acc1=['qingyun',['credit',0.0]]
acc2=copy.copy(acc1)
print(id(acc1))
print(id(acc2))


结果
139688309432648
139688333061640

 2.对象的深拷贝

import copy
acc1=['qingyun',['credit',0.0]]
acc2=copy.deepcopy(acc1)
print(id(acc1))
print(id(acc2))



结果
140635593728264
140635617357320

\