Python 官方文档:入门教程 => 点击学习
面试遇到一个问题:如何删除一个python对象?下面将介绍Python的对象引用和 del删除引用1. 首先介绍下python的对象引用1)Python中不存在传值调用,一切传递的都是对象引用,也可以认为是传址调用。即Python不允许
下面将介绍Python的对象引用和 del删除引用
3)为了简化内存管理,Python通过引用计数机制实现自动垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象。
Python在heap中分配的对象分成2类:
不可变对象(immutable object):Number(int、float、bool、complex)、String、Tuple. 采用等效于“传引用”的方式。
可变对象(mutable object):List、dictionary.采用等效于“传值”的方式。
Python的数据类型和c不太一样,有一种分类标准,可变(mutable)/不可变(immutable).
我理解的可变,就是在内存中的那块内容(value)是否可以被改变。如果是不可变的,在对对象本身操作的时候,必须在内存的另外地方再申请一块区域(因为老区域#不可变#),老的区域就丢弃了(如果还有其他ref,则ref数字减1,类似unix下的hard-link)。如果是可变的,对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的address会保持不变,但区域会变长或者变短。
list1 = [1, 2, 3]
list2 = list1
list3 = list1
print('list1=', list1, '\nlist2=', list2, '\nlist3=', list3)
print('id(list1)=', id(list1), '\nid(list2)=', id(list2), '\nid(list3)=', id(list3))
list1= [1, 2, 3]
list2= [1, 2, 3]
list3= [1, 2, 3]
id(list1)= 2604378467016
id(list2)= 2604378467016
id(list3)= 2604378467016
一开始list1,list2,list3的取值和id都相同
list2 = list2 + [4] # 不可变类型操作
print('list1=', list1, '\nlist2=', list2, '\nlist3=', list3)
print('id(list1)=', id(list1), '\nid(list2)=', id(list2), '\nid(list3)=', id(list3))
list1= [1, 2, 3]
list2= [1, 2, 3, 4]
list3= [1, 2, 3]
id(list1)= 2604378467016
id(list2)= 2604378402376
id(list3)= 2604378467016
进行操作 list2 = list + [4] 这个不可变类型操作后,list1和list3没有受到影响,list2的值和id都发生变化。
list2 += [4] # 可变类型操作
print('list1=', list1, '\nlist2=', list2, '\nlist3=', list3)
print('id(list1)=', id(list1), '\nid(list2)=', id(list2), '\nid(list3)=', id(list3))
list1= [1, 2, 3]
list2= [1, 2, 3, 4, 4]
list3= [1, 2, 3]
id(list1)= 2604378467016
id(list2)= 2604378402376
id(list3)= 2604378467016
进行操作list2 += [4] 这个可变类型操作后,list2的内容和id均发生变化
list3.append(5) # 可变类型操作
print('list1=', list1, '\nlist2=', list2, '\nlist3=', list3)
print('id(list1)=', id(list1), '\nid(list2)=', id(list2), '\nid(list3)=', id(list3))
list1= [1, 2, 3, 5]
list2= [1, 2, 3, 4, 4]
list3= [1, 2, 3, 5]
id(list1)= 2604378467016
id(list2)= 2604378402376
id(list3)= 2604378467016
列表append()操作是可变类型操作,执行list3.append(5)之后,list1和list3指向的列表元素发生变化,但是id不变。
可以看到x和y指向同一个列表,但是删除x后,y并没有受到影响。这是为什么呢?
The reason for this is that you only delete the name,not the list itself,In fact ,there is no way to delete values in python(and you don’t really need to because the python interpreter does it by itself whenever you don’t use the value anymore)
举个例子,一个数据(比如例子中的列表),就是一个盒子,我们把它赋给一个变量x,就是好像把一个标签x贴到了盒子上,然后又贴上了y,用它们来代表这个数据,但是用del删除这个变量x就像是把标有x的标签给撕了,剩下了y的标签。
再看一个例子:
--结束END--
本文标题: Python编程学习3:Python 对
本文链接: https://lsjlt.com/news/186380.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0