Discuss / Python / Python不会回收内存吗

Python不会回收内存吗

Topic source

默认参数有坑:

def add_end(L=[]): L.append('END') return L 多次调用add_end()会得到一个含有多个'END'的list。 第一次调用的时候,Python开了一块内存用来存放一个空的list, 然后把变量L指向这个空的list,函数第一次执行,存入一个'END'到空的list中。然后退出,退出之后,Python不回收放有一个‘END’的那块内存么?即使不回收,第二次执行的时候不是应该又新开了一片内存么?

代码运行,解释器跑函数跑def add_end(L=[]):,到这里就跳过函数继续去跑下面的代码,它只知道你申明了这个函数,定义了这个变量L指向一个列表,在同一个代码块下每次调用默认参数的函数时,你调用的都是这个L,去取L指向的列表,列表是可变类型,所以每次APPEND都不会给你开新空间,它只知道你的L没变,不知道你L指向的东西内部已经变了

def add_end(L=[]): L.append('END') return L print(add_end([1,2,3]),id(add_end([1,2,3]))) print(add_end([1,2,3]),id(add_end([1,2,3]))) print(add_end(),id(add_end())) print(add_end(),id(add_end()))

[1, 2, 3, 'END'] 860490140872 [1, 2, 3, 'END'] 860490141192

['END', 'END'] 860490141000 ['END', 'END', 'END', 'END'] 860490141000

def add_end(L=[]): L.append('END')

# print(id(L))
return L

print(add_end(),id(add_end())) print(add_end([1,2,3]),id(add_end([1,2,3]))) print(add_end(),id(add_end()))

['END', 'END'] 617652063560 [1, 2, 3, 'END'] 617652063752 ['END', 'END', 'END', 'END'] 617652063560

默认参数的地址一直没变,也就是说一直没有重走函数头 我有个猜想是 函数头在一开始被声明,调用函数的时候不过函数头,直接走函数体 有点昏了,不晓得函数调用的时候到底在干嘛=。=先记住这个现象算了

def add_end(L=[]): L.append('END') return L

a=[1,2,3] print(add_end(a),id(add_end(a))) print(add_end(a),id(add_end(a)))

[1, 2, 3, 'END', 'END'] 32202852808 [1, 2, 3, 'END', 'END', 'END', 'END'] 32202852808

新论据,不知道咋表述


  • 1

Reply