python--关于垃圾回收机制的一些理解

python垃圾回收机制小问题

# python 中关于命名空间和垃圾回收机制
print([] == [])  # True
print([] is [])  # False
print(id([]), id([]))  # 35156656 35156656  

# 因为值相同,所以为True
# 解释:python解释器在读到第一个空列表,会开辟一个内存空间给它,再读第二个空列表,会开辟一个新的内存空间,故id不同
# 内存地址相同:python解释器在读到第一个空列表时,会开辟一个内存空间,当读到逗号时,第一个空列表触发垃圾回收机制,因为它的引用计数为零,所以被销毁掉.这时候往后读,读到第二个空列表时,就会将刚刚释放掉的内存地址给第二个空列表,就会显示两个内存地址相同的情况.

 

通过来及回收机制证明函数默认关键字参数内存开辟时间--在函数定义时,python解释器读到这一个函数的时候就开辟了.

print(id([]))  # 49745712


def fun(a, ):
    pass


print(id([]))  # 49745712
# 第一个空列表在打印完后因为没有引用,就被垃圾回收机制回收了,第二个空列表开辟内存空间时就近指向了刚刚释放的这个内存,所以两者相同
print(id([]))  # 48959280


def fun(a,li=[]):
    print(id(li))
    pass


print(id([]))  # 48957560

# 第一个空列表在打印完后因为没有引用,就被垃圾回收机制回收了,释放掉的内存空间直接被li指向了.所以第三个print出来的id与第一个就不相同了.
print(id([]))  # 48959280


def fun(a, li=[]):
    print(id(li))
    pass


fun(1)  # 48959280
print(id([]))  # 48957560

# 通过打印li的id,再次证明.第一个空列表在打印完后因为没有引用,就被垃圾回收机制回收了,释放掉的内存空间直接被li指向了.所以第三个print出来的id与第一个就不相同了.

 

posted on 2018-08-20 13:47  None——None  阅读(102)  评论(1)    收藏  举报

导航