Heim  >  Artikel  >  Backend-Entwicklung  >  深入理解python函数传参机制

深入理解python函数传参机制

高洛峰
高洛峰Original
2016-10-19 17:16:331236Durchsuche

首先需要申明的一点是,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中的对象和引用有了更深一步的了解了呢?


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn