标签:
python中的参数传递类似java,有着自己的内存回收机制,这和C++有着很大的差别。
1.函数的参数传递:
>>> a = [1, 2, 3] >>> def fun(a): for i in a: print i
a.append(4) >>> fun(a) 1 2 3 44807792 >>> a [1, 2, 3, 4]
从上面的结果可以看出,python的函数传递是引用传递,因此,在函数体内修改对象内容会导致函数外面的对象内容改变。
这个对于一些内置类型,如int,float是不成立的。
注意,如果在函数内对传进来的参数做del操作是不会对实际对象产生影响的,因为del删除的是该引用,而实际对象的引用数至少为1,所以不会被回收。
2.函数的返回:
>>> def fun(): a = [1, 2, 3] print id(a) return a >>> a = fun() 44806192 >>> id(a) 44806192
>>> def fun(): a = 1 print id(a) return a >>> a = fun() 34243104 >>> id(a) 34243104
可以看出,函数返回的也是对象的引用,而对象此时的引用计数为1,所以不会被内存回收。
这在C++中是肯定错误的,但是python有自己的内存回收机制,因此是没问题的。
3.总结:
python和java类似,没有指向对象的指针,每个对象都是靠引用对其进行操作,因此在函数传递和函数返回时,通过对同一个对象的引用实现了对同一个对象的操作。当函数调用结束时,对象的内存不会消失,但是引用本身会被回收。
标签:
原文地址:http://www.cnblogs.com/chybot/p/4558956.html