python的底層是通過C語言實現,因此參數調用時是通過地址傳遞的(和C語言一樣,值是單向傳遞,指針才能實現雙向傳遞),比如:
# -*- coding: utf-8 -*-
def f1(x,y):
z=x+y
y=x
return z
a= 1 b=2 c=f1(a, b) print c, a, b
得到的結果是
3 1 2
從這里可以看出b值並沒有變化,也就是說值是單向傳遞的。
函數的定義時,參數可以是數值,列表(當元組處理),字典等,其參數定義形式如下:
def f(a, *pargs, **kargs):
print(a, pargs, kargs)
實際上這是python的很重要的一個特性,即arbitrary arguments。當你需要一個函數支持任意多個參數的時候,你就會用到它。上面例子中的那個函數,python會把匹配上的參數作為一個tuple(元祖)來處理。可以像下面這樣調用函數f,
f(1, 3, 'abc', ('lls', 'pow'), param1 = 'A')
打印出來結果如下:
(1, (3, 'abc', ('lls', 'pow')), {'param1': 'A'})
python會把1匹配給參數a,把3, 'abc', ('lls', 'pow')匹配給pargs,可以看出pargs被用tuple (3, 'abc', ('lls', 'pow'))賦值。
類似的,前面出現兩個星號的kargs會被用字典匹配,即所有像param = x這種格式的傳入參數會被轉成dict賦值給給kargs。
需要注意的是,在定義函數的時候**kargs這種類型的參數必須放在最后(如果有的話),而*pargs這種類型的參數必須放在**kargs這種類型參數的前面,其他類型參數的后面。
比如下面這幾種定義都是非法的
def f(a, *b, c=6, **d): pass def f(a, **b, *c): pass def f(*a, **b, c): pass def f(a, b, *c, **d, e): pass
而下面這幾種定義都是合法的
def f(a, **b): pass def f(a, *b): pass def f(*a, **b): passs def f(**a): pass def f(a, b=1, *c, **d): pass
舉一個實際一點的例子,寫一個函數,輸入任意多個數字作為參數,找到其中最大的一個,就可以利用我們提到的*pargs, 代碼如下:
1 def max(*pargs): 2 maxNum = pargs[0] 3 for i in pargs[1:]: 4 if i > maxNum: 5 maxNum = i 6 return maxNum 7 8 print max(5, 3, 1, 43, 54, 23, 1, 2, 32)
結果打印54。
參考博文:http://blog.chinaunix.net/uid-29466937-id-5752171.html