深化了解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中的目标和引证有了更深一步的了解了呢?


上一篇:python 完成md5加密
下一篇:三种办法删去列表中重复的元素及功率剖析!

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854