深入领略python函数传参机制
首先需要申明的一点是,python里是没有像C和C++里那样按值传参的说法的。python中的所有对象都是工具,这也是它的强大之处,它没有根基范例之说。
在python中,范例属于工具,变量是没有范例的,这正是python的语言特性,也是吸引着许多pythoner的一点。所有的变量都可以领略是内存中一个工具的“引用”,可能,也可以看似c中void*的感受。所以,但愿各人在看到一个python变量的时候,把变量和真正的内存工具分隔。
范例是属于工具的,而不是变量。这样,许多问题就容易思考了。
python中的工具可分为一两大类,即可改变的(mutable)和不行改变的(immutale).
而属于immutable类的工具主要有strings,tuples,numbers,而列表,字典等其它工具则属于mutale类的工具。
由于python中所有对象都是工具,因此python中的函数传参方法都是按引用传参的(可以领略为传的是指针),详细细节的话,我想就不需要我来说了,相信各人都已经很熟悉按引用传参的方法要领了。
增补:我适才又仔细看了下上面的内容,大概光凭下面一个案例,一些新手大概还不太大白,因此我在这再做两点小我私家的总结。
由于函数都是按引用传的,那就呈现了一种大概,如果我传一个参数arg进去,但我不但愿该参数arg在函数内修改后而影响到函数外的变量arg,假如要到达这种结果是不是有点想其它语言里的传变量复本,对差池?可是在python里没有复本一说,可是它给出了一类工具(immutable不行改变工具,小我私家预计,这类工具很大概就是因为这样的原因而被缔造出来的,呵呵)。那此刻我们假设传入一个immutable变量工具imvar到函数内,并在函数内对imvar举办修改操纵,由于imvar是不行改变工具,所以在对其举办修改时,编译器会首先为其建设一个复制工具copy_imvar再对之举办修改,所以函数中修改的实际上不是最初的工具imvar了,因此它的值仍是进入函数处理惩罚前的值。相反地假如传是可变范例变量的话,那则是直接在引用上修改,因此在函数表里操纵的都是同一工具,因此函数内的操纵会直接影响到函数外的沟通变量的值。不知道此刻是否好领略些,假如还不是很大白,团结下面的例子看看应该会大白了吧。
下面直接给出一个测试案例:
#test num=10 string='test' tupleset=(1,2,3) listset=[9,8,7] def change(num,string,tupleset,listset): num+=1 string+=' into new words!' #tupleset.add(12) error tupleset=(12,3,4,4) listset.append(10000) change(num,string,tupleset,listset) print num,string,tupleset,listset ------------------------------------------------ ans:10 test (1, 2, 3) [9, 8, 7, 10000]
看到功效是不是python中的工具和引用有了更深一步的相识了呢?