对于简单的控制语句来说,
x = 1
if x > 0:
print('true')
else:
print('false')
我们都知道当判定 x > 0时,else的语句是不会执行的,
# filename test.py
def test1():
pass
# test1()
下面是我不知道正确与否的理解:
1,对于java而言,如果没有对于 test1() 这一行代码执行对函数 test1 的调用的话,那就整个程序基本上没有意义,不会有内存分配,也不会有执行
2,但是对于 python 而言,会创建 test1 函数对象,然后保存 test1 中的一系列操作,这些操作不会被执行,即使整个程序没有对 test1 有任何的调用操作,但是只要程序没有结束,那么 test1 就会一直存在于内存中。
至于原因,是函数 test1 在程序运行后,会成为当前模块对象,即 module __main__
的属性。
3,而对于 ‘test1’ 这个函数名而言,他引用了这个函数对象,所以就算没有调用该函数,垃圾回收机制不会将其回收
# filename test.py
def test1():
def test2():
pass
# return test2()
# test1()
>>> class A(object):
a = []
def test1(self):
pass
@classmethod
def test2(cls):
print('cls.a', sys.getrefcount(cls.a))
print('cls.test1:', sys.getrefcount(cls.test1))
>>> A.test2()
('cls.a', 2)
('cls.test1:', 1)
>>> def test3():
def test4():
pass
>>> sys.getrefcount(test3)
2
>>> dir(test3)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
# sys.getrefcount(test4) NameError: name 'test4' is not defined
def test3():
def test4():
pass
return test4 # return test4()
建议以后这问题拆成两个不同问题。
(1)没有调用该函数, Python还有另一个内存管理策略reference counting:「原理: 记录一个对象被其他对象引用的次数. 当对这个对象的引用移除了, 引用计数也减小了.要是减到0了, 这个对象也就被释放了」。所以我猜,应该是在reference counting 时已回收了。
(2)有没有调用就是看某个对象的引用是否移除了,还有是否有reference cycle,这里的邮件讨论串有一个类近的讨论,不知道算不算回答了你这个问题。