python函數中參數的傳遞


 Python唯一支持的參數傳遞方式是『共享傳參』(call by sharing)多數面向對象語言都采用這一模式,包括Ruby、Smalltalk和Java(Java的引用類型是這樣,基本類型按值傳遞)共享傳參是指函數的各個形式參數獲得實參中各個引用的副本;也就是說,函數內部的形參是實參的別名(alias)這種方案的結果是,函數可能會修改作為參數傳入的可變對象,但是無法修改那些對象的標識(即不能把一個對象替換為另一個對象.

 1  >>> def fun(num,l,d):
 2 ...     num=123;
 3 ...     l=[1,2,3]
 4 ...     d={'a':123}
 5 ...     print("inside:","num=%f,l=%s,d=%s"%(num,l,d))
 6 ... 
 7 >>> num=1
 8 >>> l=[1,1,1]
 9 >>> d={'nice':111}
10 >>> print("before:","num=%f,l=%s,d=%s"%(num,l,d))
11 before: num=1.000000,l=[1, 1, 1],d={'nice': 111}
12 >>> fun(num,l,d)
13 inside: num=123.000000,l=[1, 2, 3],d={'a': 123}
14 >>> print("after:","num=%f,l=%s,d=%s"%(num,l,d))
15 after: num=1.000000,l=[1, 1, 1],d={'nice': 111
需要說明的是:函數內部的num,l,d和命令行里的num,l,d是不同的變量,只是名字相同。函數內部的是形參,命令行里的是實參。
修改傳遞進來對象的內容,即不是讓形參指向不同對象,而是通過引用修改對象內容。當然這個對象必須是可變的。
 1 >>> def fun2(num1,l1,d1):
 2 ...     num1=123
 3 ...     l1[0]=123
 4 ...     d1['a']=123
 5 ...     print("inside:","num1=%f,l1=%s,d1=%s"%(num1,l1,d1))
 6 ... 
 7 >>> num=111c
 8 >>> l=[1,1,1]
 9 >>> d={'a':111,'b':0}
10 >>> print("before:","num=%f,l=%s,d=%s"%(num,l,d))
11 before: num=111.000000,l=[1, 1, 1],d={'a': 111, 'b': 0}
12 >>> fun2(num,l,d)
13 inside: num1=123.000000,l1=[123, 1, 1],d1={'a': 123, 'b': 0}
14 >>> print("after:","num=%f,l=%s,d=%s"%(num,l,d))
15 after: num=111.000000,l=[123, 1, 1],d={'a': 123, 'b': 0}

 

小結:python中一切皆對象,函數中傳遞的是對象的引用,當形參指向了不同對象,實參不會改變;當形參通過傳遞來的引用修改了對象的內容,實參會跟着改變,因為形參和實參指向的是同一個對象。其中不僅是函數參數的傳遞是這樣,在函數內部也是這樣。當一個變量向另一個變量賦值時,給的是對象的引用,這個對象的引用,感覺相當於c語言中變量的地址,只是在python中,這個地址變量是通用的,可以指向任意類型,當你改變了這個地址,相當與python中指向了不同對象,原來變量的地址沒有改變,所以原來變量指向的地址的內容沒有改變。當你通過這個地址改變了地址里面的內容時,原來變量指向的地址的內容也會跟着改變。

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM