python2.7 - python 函数或者类 代码的执行顺序
问题描述
修改了一下问题,大家直接先看例 3对于简单的控制语句来说,
x = 1if x > 0: print(’true’)else: print(’false’)
我们都知道当判定 x > 0时,else的语句是不会执行的,
python 属于解释型语言,对于函数来讲,例1# filename test.pydef test1(): pass # test1()
下面是我不知道正确与否的理解:
1,对于java而言,如果没有对于 test1() 这一行代码执行对函数 test1 的调用的话,那就整个程序基本上没有意义,不会有内存分配,也不会有执行2,但是对于 python 而言,会创建 test1 函数对象,然后保存 test1 中的一系列操作,这些操作不会被执行,即使整个程序没有对 test1 有任何的调用操作,但是只要程序没有结束,那么 test1 就会一直存在于内存中。至于原因,是函数 test1 在程序运行后,会成为当前模块对象,即 module __main__ 的属性。3,而对于 ‘test1’ 这个函数名而言,他引用了这个函数对象,所以就算没有调用该函数,垃圾回收机制不会将其回收
嵌套函数 例2# filename test.pydef test1(): def test2():pass # return test2() # test1()对于例 1,我的理解有错误吗?对比例 2 中 test1 的内层函数 test2 的情况是怎么样的,有调用和没有调用的情况会有什么不同吗?之前问题可能描述的不太清楚,这儿再举一个例子 3
>>> 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)上面的输出这个 2 可以理解,但是为什么另一个是 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现在的问题是 test3 中的内层函数 test4 在内存中吗?如果在的话,在哪儿?(我觉得是应该在内存中的)如果没在的话,为什么没有 test4? 如果没有 test4 的话,修改一下上面的代码又该怎么看 ?
def test3(): def test4():pass return test4 # return test4()刚刚修改了问题的时候,突然想到对于编程来讲可能没什么实际意义,大家可能都会知道怎么去定义使用内层函数。但我还是希望有人能解答我的问题
问题解答
回答1:建議以後這問題拆成兩個不同問題。(1)没有调用该函数, Python還有另一個内存管理策略 reference counting:「原理: 记录一个对象被其他对象引用的次数. 当对这个对象的引用移除了, 引用计数也减小了. 要是减到0了, 这个对象也就被释放了」。所以我猜,應該是在reference counting 時已回收了。
(2)有沒有調用就是看某個對象的引用是否移除了,還有是否有reference cycle,這裡的郵件討論串有一個類近的討論,不知道算不算回答了你這個問題。
相关文章:
1. docker-machine添加一个已有的docker主机问题2. angular.js - 为什么给 Angular 指令绑定事件无法生效3. 为什么我ping不通我的docker容器呢???4. golang - 用IDE看docker源码时的小问题5. html5 - 使用angular中,图片上传功能中选择多张图片是怎么实现的?有什么好的思路吗?6. docker - 各位电脑上有多少个容器啊?容器一多,自己都搞混了,咋办呢?7. MySQL 查询疑问?8. mysql - 求SQL语句9. php如何获取访问者路由器的mac地址10. mysql 5个left关键 然后再用搜索条件 几千条数据就会卡,如何解决呢
