python函式在傳參的時候,到底在傳些什麼?

2021-08-14 18:59:16 字數 2196 閱讀 9486

c++這樣的語言用多了之後,在python函式傳遞引數的時候,經常會遇到乙個問題,我要傳遞乙個引用怎麼辦?

比如我們想要傳乙個x到函式中做個運算改變x的值:

def

change

(y):

y += 1

x = 1

print ("before change:", x)

change(x)

print ("after change: ", x)

得到的結果是

before change: 1

after change: 1

完全沒用~~~這是怎麼回事?

我來說明一下這個過程~

也就是說python中的等號就是把變數指向了乙個例項而已。

那麼,如何做到其它語言中引用這樣的效果呢?乙個比較推薦的方法就是用把引數return回去就可以了,如下面**所示。

def

change

(y):

y += 1

return y

x = 1

print ("before change:", x)

x = change(x)

print ("after change: ", x)

結果為

before change: 1

after change: 2

另一種方法就是,我們不讓函式中的引數指向新的位址不就可以了,我們讓它在原來的位址上修改我們的值。這一點,只有一部分的資料型別可以做到,我們把這樣的物件叫做可變物件,做不到的就叫不可變物件。

舉幾個例子更為通俗易懂

def

change

(x):

x = [1, 2, 3]

print ("before change:", x, "id:", id(x))

change(x)

print ("after change:", x, "id:", id(x))

after change: [1, 2, 3, 0] id: 140623459512008

def

change

(x):

print ("before equal:", x, "id:", id(x))

x = [5]

print ("after equal:", x, "id:", id(x))

x = [1, 2, 3]

print ("before change:", x, "id:", id(x))

change(x)

print ("after change:", x, "id:", id(x))

before

equal: [1, 2, 3] id: 139683058095432

after

equal: [5] id: 139683058028360

after change: [1, 2, 3] id: 139683058095432

這下應該就搞清楚是怎麼回事了吧,不過正是因為python的這種特性,在函式設定預設引數的時候,我們要注意盡量不用可變物件當預設值,否則會發生下面這種情況

def

change

(x=):

return x

print (change())

print (change())

[1]

[1, 1]

比較妥當的做法是用不可變物件來代替,比如none

def

change

(x=none):

ifnot x:

x =

return x

print (change())

print (change())

此時的輸出為

[1]

[1]

python 函式傳參 傳參和傳引用

首先還是應該科普下函式引數傳遞機制,傳值和傳引用是什麼意思?函式引數傳遞機制問題在本質上是呼叫函式 過程 和被呼叫函式 過程 在呼叫發生時進行通訊的方法問題。基本的引數傳遞機制有兩種 值傳遞和引用傳遞。值傳遞 passl by value 過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在...

Python函式傳參

首先還是應該科普下函式引數傳遞機制,傳值和傳引用是什麼意思?函式引數傳遞機制問題在本質上是呼叫函式 過程 和被呼叫函式 過程 在呼叫發生時進行通訊的方法問題。基本的引數傳遞機制有兩種 值傳遞和引用傳遞。值傳遞 passl by value 過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在...

python 函式傳參

函式的好處 1.保持一致性 2.可重用 3.可擴充套件 函式的返回值 1.空,返回none 2.有乙個物件,返回當前物件 3.有多個物件,返回元組 tuple import time 定義函式,列印日誌時間 deflogger time format y m d x time current tim...