Python之道 函式引數的傳遞

2021-08-27 12:43:02 字數 2255 閱讀 4553

pyhton版本:2.7

主機環境:gentoo linux with kernel 3.4.36

引數的傳遞都是通過賦值給本地變數名實現的。

不可變引數是通過「值」來傳遞的:在函式內修改變數不會傳遞給外面的變數

可變物件是通過「指標」來傳遞的:在函式內修改變數會傳遞給外面的變數

這個和c語言類似。

看下面的例子:

a = 1

b = ["some",]

def changer(x,y):

x = 3

y[0] = "spam"

changer(a,b)

print a,b

數字是不可變物件,而列表是可變物件。執行結果如下:

1 ['spam']
自動傳入物件的引數進行賦值的後果和執行一系列的簡單的賦值語句是相同的。對於第乙個引數x呼叫後的效果就像如下的過程:

a = 1

x = a

x = 2

print a

雖然x = 2執行之前x和a引用同乙個物件,但是當x = 2修改x變數的時候會將x指向2物件。

列印出來的結果還是1。

如果想不改變可變物件,可以在呼叫的時候將可變變數進行賦值b的賦值可以使用changer(a,b[:])或者轉換成遠祖物件changer(a,tuple(b))

引數匹配有下面幾種情況:位置、關鍵字、預設、可變引數、可變引數解包

def f(a,b,c):

return a,b,c

print f(b = 1,c = 2,a = 3)

這樣就不用關係引數的位置了。如果是想位置引數和關鍵字混用,關鍵字引數必須在位置引數之後:

def f(a,b,c):

return a,b,c

print f(1,c = 2,b = 3)

但是像這樣就不可以了:

def f(a,b,c):

return a,b,c

print f(1,c = 2,a = 3)

因為a引數已經通過位置自動賦值了引數。報錯如下:

typeerror: f() got multiple values for keyword argument 'a'
def f(a,b = 2,c = 3):

return a,b,c

print f(1)

print f(1,4)

print f(6,7,8)

執行結果:

(1, 2, 3)

(1, 4, 3)

(6, 7, 8)

def min1(test,*args):

res = args[0]

for arg in args[1:]:

ifarg < res:

res = arg

return res

def min2(first,*rest):

res = first

for arg in rest:

if arg < res:

res = arg

return res

def min3(*args):

tmp = list(args)

tmp.sort(reverse = false)

return tmp[0]

def f(a,**dargs):

return a,dargs

print f(1,b = 2,c = 3)

這個執行結果:(1, )

l = [3,4]

d =

def f(a,b,c,d):

return a,b,c,d

print f(*l,**d)

輸出結果:(3, 4, 2, 1)

下面這個例子:

def func1(a,b,c=3,d=4):

print a,b,c,d

func1(a,*(5,6))

輸出結果:1 5 6 4

Python的函式引數傳遞

原址 我想,這個標題或許是很多初學者的問題。尤其是像我這樣的對c c 比較熟悉,剛剛進入python殿堂的朋友們 c c 的函式引數的傳遞方式根深蒂固的影響這我們的思維 引用?傳值?究竟是那種呢。呵呵,語言的特性決定了是使用的方法,那麼,現在我們來 一下python的函式引數傳遞方式。在開始之前,我...

Python的函式引數傳遞

看兩個例子 a 1 deffun a a 2 fun a print a 1a deffun a fun a print a 1 所有的變數都可以理解是記憶體中乙個物件的 引用 或者,也可以看似c中void 的感覺。a 1 deffun a print func in id a func in 41...

Python的函式引數傳遞

看兩個例子 python a 1 def fun a a 2 fun a print a 1 a 1 def fun a a 2 fun a print a 1 python a def fun a fun a print a 1 所有的變數都可以理解是記憶體中乙個物件的 引用 或者,也可以看似c中...