python对象的引用和可变性、和垃圾回收

python变量

#python和java中的变量本质不一样,python的变量实质是一个指针 int str,
#便利贴
a=1
a=“abc”
#1.a贴在对象1上
#2.先生成对象,然后将变量指向对象。
a=[1,2,3]
b=a
print(id(a),id(b))
print(a is b)

对象引用参数传递经典错误


def add(a,b):
    a+=b
    return a


class  Company:
    def __init__(self,name,staffs=[]):
        self.name=name
        self.staffs=staffs
    def add(self,staff_name):
        self.staffs.append(staff_name)
    def remove(self,staff_name):
        self.staffs.remove(staff_name)



if __name__=="__main__":

   com1=Company("like",["xiapang","xiaohe","m"])
   com1.add("music")
   com1.remove("m")
   print(com1.staffs)#['xiapang', 'xiaohe', 'music']
   com2=Company("like2")
   com2.add("xiaopang")
   print(com2.staffs)#['xiapang', 'xiaohe', 'music']

   com3=Company("like3")
   com3.add("xiaohe")
   print(com2.staffs)#['xiaopang', 'xiaohe']
   print(com3.staffs)#['xiaopang', 'xiaohe']
   print(com2.staffs is com3.staffs)#True
   '''
   为什么两个不同的对象com2和com3它们的staffs却
   互相影响了,
   1.参数数staffs是列表,是可变对象
   2.因为com2和com3刚开传参的时候没有传递staffs
   这个列表作为参数,所以内部会调用默认的list,
   2个对象都是用的是默认的list
   
   
   '''













    # a=1
    # b=2
    # c=add(a,b)
    # print(c)#3
    # print(a,b)#1 2

    # a=[1,2]
    # b=[3,4]
    # c = add(a, b)
    # print(c)#[1, 2, 3, 4]
    # print(a,b)#[1, 2, 3, 4] [3, 4]
    #
    # a=(1,2)
    # b=(3,4)
    # c = add(a, b)
    # print(c)#(1, 2, 3, 4)
    # print(a,b) #(1, 2) (3, 4)

==和is

a=[1,2,3,4]
b=[1,2,3,4]
print(a==b)#True 会调用__eq__ 来判断他们的值
print(id(a),id(b)) #167632840 167484552
print(a is b) # False

c=1
d=1
print(id©,id(d)) #1633938544 1633938544
print(c is d)#True

delete和垃圾回收的区别

在这里插入图片描述


#cpython2.0中垃圾回收的算法是采用  引用计数
a=object()
b=a
del a
#del并不是回收机制,它是删除了一个变量
# 的引用,并将其引用计数减1
#而垃圾回收机制则是在引用计数为0时才进行回收
print(b)
# print(a)

class  A:
   #当python解释器要回收的时候,它就可以执行
   #__del__ 这个魔法函数里的逻辑
    def  __del__(self):
        pass
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章