【Python有坑系列】函数参数传递:传值?引用?
<p style="margin-left:10px;">一、首先要说的是:变量 与 对象 <p style="margin-left:10px;">在python中,类型属于对象,变量是没有类型的,这正是python的语言特性,也是吸引着很多pythoner的一点。所有的变量都可以理解 是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉。所以,希望大家在看到一个python变量的时候,把变量和真正的内存对象分开。 <p style="margin-left:10px;">类型是属于对象的,而不是变量。这样,很多问题就容易思考了。 <p style="margin-left:10px;">例如:? <p style="margin-left:10px;">nfoo = 1?? #一个指向int数据类型的nfoo(再次提醒,nfoo没有类型) <p style="margin-left:10px;">lstFoo = [1]?? #一个指向list类型的lstFoo,这个list中包含一个整数1。 <p style="margin-left:10px;">接着说例子好了: <p style="margin-left:10px;">def ChangeInt( a ): <p style="margin-left:10px;">????? a = 10? # change the number <p style="margin-left:10px;">nfoo = 2? <p style="margin-left:10px;">ChangeInt(nfoo) <p style="margin-left:10px;">print nfoo #结果是2 <p style="margin-left:10px;">这时发生了什么,有一个int对象2,和指向它的变量nfoo,当传递给ChangeInt的时候,按照传值的方式,复制了变量nfoo的值,这样,a就是nfoo指向同一个Int对象了,函数中a=10的时候,发生什么? <p style="margin-left:10px;">(还记得我上面讲到的那些概念么),int是不能更改的对象,于是,做了一个新的int对象,另a指向它(但是此时,被变量nfoo指向的对象,没有发生变化),于是在外面的感觉就是函数没有改变nfoo的值,看起来像C++中的传值方式。 <p style="margin-left:10px;">def ChangeList( a ): <p style="margin-left:10px;">????? a[0] = 10? # change the number <p style="margin-left:10px;">lstFoo = [2] <p style="margin-left:10px;">ChangeList(lstFoo ) <p style="margin-left:10px;">print nfoo #结果是[10] <p style="margin-left:10px;">注:<a href="http://www.cnblogs.com/bovine/archive/2011/11/26/2264390.html" rel="nofollow">原文出处 <p style="margin-left:10px;">二、点调用与参数传递 <p style="margin-left:10px;">对象调用固有方法可以用点调用,自定义函数调用需要参数传递。 <p style="margin-left:10px;">? <pre class="has">
三、类元素可修改 虽然int 是不可更改的对象,作为类的属性时却可以更改。 紧跟上述代码 <pre class="has">
四、函数内做的列表整体修改该传递不出来,但是可以改变局部列表元素 <pre class="has">
<pre class="has">
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |