先上兩個例子:
a = 1deffun(a):
a = 2fun(a)
print a #
結果為1
fun(a)中的a,可以看做函式中的形參,可以用任何字元代替:fun(aaa)
a =deffun(a):
fun(a)
print a #
結果為 [1]
所有的變數都可以理解是記憶體中乙個物件的「引用」,或者,也可以看似c中void*的感覺。
這裡記住的是型別是屬於物件的,而不是變數。而物件有兩種,「可更改」(mutable)與「不可更改」(immutable)物件。在python中,strings, tuples, 和numbers是不可更改的物件,而list,dict等則是可以修改的物件。(這就是這個問題的重點)
當乙個引用傳遞給函式的時候,函式自動複製乙份引用,這個函式裡的引用和外邊的引用沒有半毛關係了.所以第乙個例子裡函式把引用指向了乙個不可變物件,當函式返回的時候,外面的引用沒半毛感覺.而第二個例子就不一樣了,函式內的引用指向的是可變物件,對它的操作就和定位了指標位址一樣,在記憶體裡進行修改.
看下面幾個例子:
>>> defmodifier(number,string,list):
number = 5string = '
goodbye
'list = [4,5,6]
"inside:
", number,string,list
>>> num = 10
>>> string = '
hello
'>>> list = [1,2,3]
'before:
', num, string, list
before: 10 hello [1, 2, 3]
>>>modifier(num,string,list)
inside: 5 goodbye [4, 5, 6]
'after:
', num, string, list
after: 10 hello [1, 2, 3]
>>> defmodifier(list,dict):
list[0] = 10dict['a
'] = 10
'inside list = %s, dict = %s
' %(list,dict)
>>> dict =
>>> list = [1,2,3,4,5]
'before list = %s, dict = %s
' %(list,dict)
before list = [1, 2, 3, 4, 5], dict =
>>>modifier(list,dict)
inside list = [10, 2, 3, 4, 5], dict =
'after list = %s, dict = %s
' %(list,dict)
after list = [10, 2, 3, 4, 5], dict =
>>> defswap(list):
temp =list[0]
list[0] = list[1]
list[1] =temp
>>> list = [10,20]
>>>list
[10, 20]
>>>swap(list)
>>>list
[20, 10]
dd
Python中函式引數的傳遞
python中函式引數的傳遞是通過 賦值 來傳遞的。但這條規則只回答了函式引數傳遞的 戰略問題 並沒有回答 戰術問題 也就說沒有回答怎麼賦值的問題。函式引數的使用可以分為兩個方面,一是函式引數如何定義,二是函式在呼叫時的引數如何解析的。而後者又是由前者決定的。函式引數的定義有四種形式 1.f arg...
python中函式引數的傳遞
實際引數按照前後順序依次賦值給形式引數。def party area,person print 晚上聚會 print 地點 area print 參與人員 person print 有了酒,就有了故事.party 皇家一號 全體人員 函式宣告定義時,可以給某個引數設定預設資料,在呼叫執行時 有預設資...
Python函式中的引數傳遞
函式的引數 1 函式的引數是可選的 2 函式需要處理的資料應該通過引數來傳遞 3 函式名後面括號裡的引數被稱為形參,由於它不是實際存在的引數所以又稱虛擬引數 4 呼叫函式時後面括號裡的引數稱為實參 def create fib n fib list 0 1 for i in range n 2 re...